Python PyZMQ推送套接字在发送时不阻塞()

Python PyZMQ推送套接字在发送时不阻塞(),python,zeromq,pyzmq,Python,Zeromq,Pyzmq,中的ZMQ\u PUSH部分指出,在没有下游节点的PUSH套接字上调用send()应该阻塞,直到至少有一个节点可用为止 但是,运行以下代码似乎不会阻止send()。此外,在运行匹配的PULL socket并收到以下消息之前,进程不会退出: import zmq import time zmq_context = zmq.Context() print '> Creating a PUSH socket' sender = zmq_context.socket(zmq.PUSH) prin

中的
ZMQ\u PUSH
部分指出,在没有下游节点的PUSH套接字上调用
send()
应该阻塞,直到至少有一个节点可用为止

但是,运行以下代码似乎不会阻止
send()
。此外,在运行匹配的PULL socket并收到以下消息之前,进程不会退出:

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中的一个bug

版本信息:Windows7、Python2.7、Pyzmq14.0.1

编辑

在做了一些修改之后,似乎如果我替换了sender.connect('tcp://localhost:5555)与
发送方绑定('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。在这种情况下,第一条消息将被缓冲,第二条发送将被阻止,直到第一条消息被实际发送。

据我所知,在这种情况下,相关HMW是下游节点的,而不是推送节点的。此外,如果不是
sender.connect('tcp://localhost:%s“%5555)
I do
sender.bind('tcp://127.0.0.1:%s“%5555)
,它按预期工作。这是因为每个对等方都创建了缓冲区
sock.connect
立即在连接器上创建一个管道,如果到达,则在活页夹上创建另一个管道<另一方面,代码>绑定在对等连接之前不会创建任何管道,并且随着更多对等连接,它会创建更多管道。换句话说,
connect
的初始条件是“一个空缓冲区可用,HWM条件不满足”,而
bind
的初始条件是“零缓冲区可用,HWM条件满足”。我应该使用bind()还是connect()在这种情况下,那么?您不应该让HWM行为决定您是要绑定还是连接-通常,您的两个服务中的一个要么先启动,寿命更长,要么是单实例,而另一个可能稍后启动/停止,更频繁,或者同时有多个实例。前者应该绑定,而后者连接。如果您的一个对等方可以被视为更传统的“服务器”,那么很可能就是要绑定的那个。