ZMQ代理商未收到带有异步信息的消息

时间:2019-05-06 06:23:06

标签: python zeromq python-asyncio pyzmq hyperledger-sawtooth

我正在使用pyzmq经销商套接字和提供的asyncio功能为Hyperledger Sawtooth事件设置侦听器。当前,即使将消息发送到套接字,也要返回期货,但有时只是完成。

这奇怪地适用于连接消息(仅当如下所示在其之前休眠时),而不适用于事件消息。我已经用JavaScript实现了它,并且可以正常工作。看来问题不在于Sawtooth,而在于pyzmq对asyncio功能的实现或在我的代码中。

class EventListener:
    def __init__(self):
        ...
        ctx = Context.instance()
        self._socket = ctx.socket(zmq.DEALER)
        self._socket.connect("tcp://127.0.0.1:4004")

    async def subscribe(self):
        ...
        await self._socket.send_multipart([connection_msg])

    async def receive(self):
        # Necessary wait otherwise the future is never finished
        await asyncio.sleep(0.1)
        resp = await self._socket.recv_multipart()
        handle_response(resp)

    async def listen(self):
        while True:
            # here sleep is not helping
            # await asyncio.sleep(0.1)

            # follwing await is never finished
            resp = await self._socket.recv_multipart()
            handle_response(resp)
...
listener = listener.EventListener()
await asyncio.gather(
    listener.receive(), listener.subscribe())
await asyncio.create_task(listener.listen())
...

调试表明,返回的Future对象从未从挂起状态更改为完成状态。那么,我的代码是否正确,是否需要以其他方式等待消息,或者pyzmq的asyncio功能是否有问题?另外,为什么我需要睡在receive()中,这不是为什么我们会有asyncio吗?

1 个答案:

答案 0 :(得分:2)

查询太多,此答案可能无法解决所有问题。希望至少这将有助于其他人寻找一种设置事件侦听器的方法。

Hyperledger Sawtooth python SDK为客户端提供了订阅事件的选项。您可以在https://github.com/hyperledger/sawtooth-sdk-python/blob/master/sawtooth_sdk/messaging/stream.py

上找到可完成您要执行的操作的SDK SDK代码部分

在此处https://github.com/danintel/sawtooth-cookiejar/blob/master/events/events_client.py

中可以找到使用Hyperledger Sawtooth python SDK进行事件订阅的示例代码。