2016-08-18 4 views
0

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

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.

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^