如何轮询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 条件变量)会引发很多问题。
我有 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 条件变量)会引发很多问题。