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)
,它会按预期工作。但不确定它是如何相关的。
答案 0 :(得分:2)
您提供的示例中没有点击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.在这种情况下,第一条消息将被缓冲,第二条发送将被阻塞,直到实际传输第一条消息。