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的情况。在这种情况下,第一个消息将被缓冲,第二个发送将被阻塞,直到实际发送第一个消息为止。

08-07 10:26