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

Python 使用zeromq实现非阻塞发布机制时出现问题,python,nonblocking,zeromq,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

我想使用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,但结果类似)


提前非常感谢

您可以轻松更改:
发件人。连接(“tcp://localhost:5555“”
发件人。绑定(“”tcp://localhost:5555“”
,反之亦然


它使您能够连接到任何您喜欢的接收器。无论是否有接收者,发送者都可以工作。

您可以轻松更改:
发送者。连接(“tcp://localhost:5555“”
发件人。绑定(“”tcp://localhost:5555“”
,反之亦然


它使您能够连接到任何您喜欢的接收器。无论是否有接收者,发送者都会工作。

在修复您的样本后:

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在关闭套接字之前只会等待延迟毫秒


不要将此值设置得太低,因为即使发件人正在侦听,也会导致消息丢失(因为ZMQ可能会在消息实际发送之前关闭套接字)。

修复示例后:

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在关闭套接字之前只会等待延迟毫秒


不要将此值设置得太低,因为即使发送方正在侦听,也会导致消息丢失(因为ZMQ可能会在消息实际传递之前关闭套接字)。

该代码实际上没有运行(未定义NOBLOCK符号)。它确实有助于发布人们可以剪切和粘贴的代码。这些代码实际上并不运行(NOBLOCK符号没有定义)。发布人们可以剪切和粘贴的代码确实很有帮助。为什么sender.close()和context.term()在reciver关闭且zmq.LINGER为100或更多时不返回错误代码?或者我现在怎么知道消息发送失败了呢?当Receiver关闭并且zmq.LINGER为100或更多时,为什么sender.close()和context.term()不返回错误代码?或者我现在怎么能知道消息发送失败了?