如何轮询zmq和变量?

时间:2015-11-17 18:21:15

标签: python multithreading zeromq pyzmq

我有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秒钟才能收到消息。如果没有,则函数返回,调用循环打印一条消息并等待新消息:

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

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

在这样做的过程中,你将走向演员模型编程的道路。

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