【问题标题】:Handling keyboard interrupt in async zmq在异步 zmq 中处理键盘中断
【发布时间】:2016-12-25 10:51:53
【问题描述】:

我正在使用asynciopyzmq 中创建一个ZeroMQ 服务器。我正在尝试优雅地处理停止服务器,但是关于异步模块的文档很少,并且似乎没有一种简单的方法来处理停止当前的轮询/等待。在.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 干净地终止。

【问题讨论】:

    标签: python zeromq python-asyncio pyzmq


    【解决方案1】:

    它最终成为pyzmq 实现中的一个错误。该错误已修复,现在调用 loop.stop() 可以正常工作。

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多