我正在pyzmq
使用asyncio
制作ZeroMQ服务器。我正在尝试优雅地处理停止服务器,但是关于异步模块的文档很少,并且似乎没有一种简单的方法来处理停止当前的poll / await。在.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
干净地终止。
答案 0 :(得分:0)
它最终成为pyzmq
实施中的一个错误。错误已修复,现在调用loop.stop()
按预期工作。