2016-08-18 3 views
0

asyncio을 사용하여 pyzmq의 ZeroMQ 서버를 만들고 있습니다. 나는 정상적으로 서버를 멈추는 것을 처리하려고 노력하고있다. 그러나 비동기 모듈에 대한 문서는 거의 없으며 현재 폴링/대기를 중지하는 간단한 방법이 아닌 것 같다. .stop 메서드에서 루프를 중지하면 많은 작업이 수행되지 않고 실제로 종료되지 않습니다. 이 실행중인 경우비동기 zmq에서 키보드 인터럽트 처리

daemon = ZMQHandler() 

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

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

daemon.start() 

이 어떻게 정상적으로이 중지합니까 :

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()) 

다음은이를 시작할 것 몇 가지 예제 코드는? self.socket.close()을 호출하면 zmq.error.ZMQError: Socket operation on non-socket 오류가 발생하고 self.context.destroy()을 호출하면 기본적으로 소켓이 ETERM으로 완전히 종료되지 않는다는 불만이 제기됩니다.

답변

0

pyzmq 구현시 버그가 발생했습니다. 버그가 수정되어 이제 loop.stop()을 호출하면 의도 한대로 작동합니다.