Дилер ZMQ не получает сообщение с asyncio - PullRequest
2 голосов
/ 06 мая 2019

Я настраиваю прослушиватель событий 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(), не потому ли у нас асинцио?

1 Ответ

3 голосов
/ 16 мая 2019

Слишком много запросов, этот ответ может не отвечать на все из них.Надеюсь, по крайней мере, это поможет другим, ищущим способ настроить прослушиватели событий.

Пакет Python Hyperledger Sawtooth предоставляет клиентам возможность подписаться на события.Часть кода SDK, которая делает то, что вы пытаетесь сделать, можно найти по адресу https://github.com/hyperledger/sawtooth-sdk-python/blob/master/sawtooth_sdk/messaging/stream.py

Пример кода для использования Python SDK Hyperledger Sawtooth для подписки на события можно найти здесь https://github.com/danintel/sawtooth-cookiejar/blob/master/events/events_client.py

...