PyZMQ PUSH套接字不会阻止send()

时间:2014-02-13 15:54:47

标签: python zeromq pyzmq

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) ,它会按预期工作。但不确定它是如何相关的。

1 个答案:

答案 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.在这种情况下,第一条消息将被缓冲,第二条发送将被阻塞,直到实际传输第一条消息。