我想使用 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"
当接收者宕机时,永远不会打印消息“Msg sent”,发送者永远保持在“sender.send("Sending to nobody", NOBLOCK)”中。此外,我尝试检查接收器是否已启动或未收到 connect 函数的返回值,但在这两种情况下它始终为“无”。
我正在使用 Python 2.6.5 和 zeromq 2.1
有人知道发生了什么或有替代解决方案吗? (我尝试过使用 PULL-PUSH 和 REQ-REP 但结果相似)
非常感谢
请您参考如下方法:
修复样本后:
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"
我看到的行为是打印了“消息已发送”短语,但脚本在此之后挂起并且从未真正退出。这里的问题是它卡在 close() 系统调用上。
您可以通过在套接字上设置 LINGER 选项来更改此行为:
sender = context.socket(zmq.PUB)
sender.setsockopt(zmq.LINGER, 100)
这里的值是以毫秒为单位的延迟时间。有关详细信息,请参阅 zmq_setsockopt 的手册页。这样做的实际影响是 ZMQ 在关闭套接字之前只会等待 linger 毫秒。
不要将此值设置太,因为即使发送方正在监听,这也会导致消息丢失(因为 ZMQ 可能会在消息实际传递之前关闭套接字)。
