Обработка клавиатурных прерываний в асинхронном режиме zmq

Я делаю сервер ZeroMQ в pyzmq с помощью asyncio, Я пытаюсь изящно справиться с остановкой сервера, но документации по асинхронному модулю очень мало, и, похоже, нет простого способа справиться с остановкой текущего опроса / ожидания. Остановка цикла в .stop Метод не делает много и не будет фактически выходить.

import zmq
import zmq.asyncio
import asyncio

class ZMQHandler():
    def __init__(self):
        self.loop = zmq.asyncio.ZMQEventLoop()
        asyncio.set_event_loop(self.loop)
        self.context = zmq.asyncio.Context()
        self.socket = self.context.socket(zmq.DEALER)
        self.socket.bind('tcp://127.0.0.1:5000')
        self.socket.linger = -1


    def start(self):
        asyncio.ensure_future(self.listen())
        self.loop.run_forever()

    def stop(self):
        print('Stopping')
        self.loop.stop()

    async def listen(self):
        self.raw = await self.socket.recv()
        asyncio.ensure_future(self.listen())

Вот пример кода, который будет начинать это:

daemon = ZMQHandler()

def signal_handler(num, frame):
    daemon.stop()

signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)

daemon.start()

Как мне изящно остановить это, когда он работает? Когда я звоню self.socket.close()Я получаю ошибку zmq.error.ZMQError: Socket operation on non-socketи если я позвоню self.context.destroy() это в основном жалуется, что сокеты не были завершены чисто с ETERM,

1 ответ

Решение

Это оказалось ошибкой в ​​реализации pyzmq, Ошибка была исправлена ​​и теперь звонит loop.stop() работает как задумано.

Другие вопросы по тегам