1

ZMQ 套接字文档中的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),它会按预期工作。不过,不确定它是如何相关的。

4

1 回答 1

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

于 2014-02-13T22:06:45.447 回答