Я настраиваю прослушиватель событий Hyperledger Sawtooth с помощью дилерского сокета pyzmq и предоставленной функции asyncio.В настоящее время фьючерсы возвращаются, но только иногда завершаются, даже если сообщения отправляются в Socket.
Странно, но это работает для сообщения о соединении (только во время ожидания перед ним, как показано ниже), но не для сообщений о событиях.Я реализовал это уже с помощью 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()
, не потому ли у нас асинцио?