Обработка клавиатурных прерываний в асинхронном режиме 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()
работает как задумано.