在异步 zmq 中处理键盘中断
Handling keyboard interrupt in async zmq
我正在 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
。
它最终成为 pyzmq
实现中的一个错误。该错误已修复,现在调用 loop.stop()
可以正常工作。
我正在 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
。
它最终成为 pyzmq
实现中的一个错误。该错误已修复,现在调用 loop.stop()
可以正常工作。