如何轮询zmq和变量?

How to poll zmq and variable?

我有 python 服务器等待设置全局标志并退出。

在几个线程中,我有使用 zmq.Poller 等待的代码 一个消息。它超时,打印心跳消息,然后等待轮询器 对于新消息:

def timed_recv(zock, msec=5000.0):
    poller = zmq.Poller()
    poller.register(zock, zmq.POLLIN)
    events = dict(poller.poll(msec))
    data = None
    if events and events.get(zock) == zmq.POLLIN:
        # if a message came in time, read it.
        data = zock.recv()
    return data

所以在上面的函数中,我等待 5 秒消息到达。如果 none 是,函数 returns,调用循环打印一条消息并等待新消息:

while not do_exit():
    timed_recv(zock)
    print "Program still here!"
sys.exit()

do_exit() 检查退出的全局标志。

现在,如果设置了标志,则在设置标志和退出循环之间会有 5 秒的延迟。如何轮询 zock 输入和设置的全局标志以便快速退出循环?

我想我可以向轮询器添加一个文件描述符,该文件描述符在设置全局标志时关闭。这看起来合理吗?好像有点黑。

有没有更好的方法来等待 zock 上的全局标志和 POLLIN?

(我们在 debian 上使用 zmq 3.0 版。)

谢谢。

最简单的方法是放弃使用标志,并使用另一个 0mq 套接字来传达消息。然后轮询器可以在两个 0mq 套接字上等待。消息可能只是一个字节;它到达轮询器的是消息,而不是它的内容。

在这样做的过程中,您正在走向 Actor 模型编程之路。

如果开发坚持一种编程模型,就会容易得多;混合使用(例如 0mq 和 POSIX 条件变量)会引发很多问题。