ZMQ socket documentation中的ZMQ_PUSH
部分说,在没有下游节点的PUSH套接字上调用send()
应该阻塞,直到至少一个节点可用为止。
但是,运行以下代码似乎不会在send()
上阻止。另外,在运行匹配的PULL套接字并收到消息之前,该过程不会退出:
import zmq
import time
zmq_context = zmq.Context()
print '> Creating a PUSH socket'
sender = zmq_context.socket(zmq.PUSH)
print '> Connecting'
sender.connect('tcp://localhost:%s' % 5555)
print '> Sending'
sender.send('message 1')
print '> Sent'
输出:
Creating a PUSH socket
Connecting
Sending
Sent
我是否缺少某些东西,或者这是PyZmq中的错误?
版本信息:Windows 7,Python 2.7,PyZMQ 14.0.1
编辑
经过一番摆弄之后,看来如果我将
sender.connect('tcp://localhost:5555)
替换为sender.bind('tcp://127.0.0.1:5555)
,它会按预期工作。不过,不知道其关系如何。 最佳答案
在您提供的示例中,没有满足HWM条件。当您打开连接时,甚至在建立对等连接之前都会创建一个缓冲区。仅当此缓冲区已满时才会命中HWM。例如:
import zmq
zmq_context = zmq.Context()
print '> Creating a PUSH socket'
sender = zmq_context.socket(zmq.PUSH)
sender.hwm = 1
print '> Connecting'
sender.connect('tcp://localhost:%s' % 5555)
for i in range(3):
print '> Sending', i
sender.send('message %i' % i)
print '> Sent', i
HWM设置为1的情况。在这种情况下,第一个消息将被缓冲,第二个发送将被阻塞,直到实际发送第一个消息为止。