在Python中实现Zmq与Google协议缓冲区

0 投票
1 回答
708 浏览
提问于 2025-04-18 01:02

我正在尝试在Python中实现下面的场景。希望能找到一些类似实现的好例子。

---------    
Module 1
---------    
Module 2
---------        
Module 3
---------    

我想开发一个使用Google协议缓冲区的Python框架,这样消息就可以在模块1、模块2和模块3之间传递,反之亦然。

我已经创建了协议消息文件。在模块2中,我创建了一个线程,并在其中创建了zmq套接字。

现在我想在Python中添加类似于zloop的东西,这样我就可以监听来自模块1或模块3的消息,然后进行传递。

任何建议都会很感激。

1 个回答

0

pyzmq没有像czmq那样自己实现一个事件循环,而是集成了tornado的事件循环,这个功能在zmq.eventloop.ioloop里。

下面是一个简单的例子,它会接收任何在incoming上的消息,并记录下来,然后把相同的消息不做修改地发送到outgoing

import zmq
from zmq.eventloop import ioloop, zmqstream
loop = ioloop.IOLoop.instance()

ctx = zmq.Context()

incoming = ctx.socket(zmq.PULL)
incoming.bind('tcp://127.0.0.1:5555')
outgoing = ctx.socket(zmq.PUSH)
outgoing.bind('tcp://127.0.0.1:5556')

sincoming = zmqstream.ZMQStream(incoming, loop)
soutgoing = zmqstream.ZMQStream(outgoing, loop)

def relay(msg):
    print("relaying %s" % "|".join('%r' % part for part in msg))
    soutgoing.send_multipart(msg)

sincoming.on_recv(relay)

loop.start()

这里的关键在于stream.on_recv这个方法,它允许你注册一个回调函数,当有消息到达这个套接字时就会运行这个函数。

你可以在这里查看pyzmq事件循环的文档

撰写回答