我想使用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但结果相似)
非常感谢提前
答案 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>