使用zeromq实现非阻塞发布机制时出现问题

时间:2011-11-07 15:09:09

标签: python nonblocking zeromq

我想使用zeromq来传达两个进程(发送方和接收方)。现在,如果接收者进程没有运行,我希望发送者进程继续执行,即使消息丢失。

尝试使用PUB-SUB模式实现它,我注意到如果接收器没有运行,发送器会挂断。例如,在以下发件人源代码中:

import zmq

context = zmq.Context()
sender = context.socket(zmq.PUB)
sender.connect("tcp://localhost:5555")

sender.send("Sending to nobody", NOBLOCK)

print "Msg sent"

当接收方关闭时,永远不会打印消息“已发送消息”,并且发送方“永远保留在”sender.send(“发送给任何人”,“NOBLOCK”)中。此外,我试图检查接收器是否启动 connect 功能的返回,但在两种情况下它总是“无”。

我正在使用Python 2.6.5和zeromq 2.1

有人知道它正在发生什么或替代解决方案吗? (我尝试过使用PULL-PUSH和REQ-REP但结果相似)

非常感谢提前

2 个答案:

答案 0 :(得分:3)

您可以轻松地将sender.connect("tcp://localhost:5555")更改为sender.bind("tcp://localhost:5555"),并在接收方上轻松更改。

它使您能够在任何地方连接接收器。无论是否有接收器,发件人都会工作。

答案 1 :(得分:3)

修好样品后:

import zmq

context = zmq.Context()
sender = context.socket(zmq.PUB)
sender.connect("tcp://localhost:5555")

sender.send("Sending to nobody", zmq.NOBLOCK)

print "Msg sent"

我看到的行为是打印了“Msg sent”短语,但脚本在此之后挂起并且从未实际退出。这里的问题是它挂在close()系统调用上。

您可以通过在套接字上设置LINGER选项来更改此行为:

sender = context.socket(zmq.PUB)
sender.setsockopt(zmq.LINGER, 100)

这里的值是以毫秒为单位的逗留时间。有关更多信息,请参见zmq_setsockopt的手册页。这样做的实际影响是ZMQ只会在关闭套接字之前等待 linger 毫秒。

请勿将此值设置为低,因为即使发件人正在侦听,也会导致邮件丢失(因为ZMQ可能会在邮件实际发送之前关闭套接字)。 / p>