Skip to main content
 首页 » 编程设计

python之使用 zeromq 实现非阻塞发布机制时的问题

2025年05月04日22over140

我想使用 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 可能会在消息实际传递之前关闭套接字)。