我确实在我的代码中使用了pyzmq 2.2.0.1(在Windows或Linux上运行python27),当我运行它时,它的工作原理(也是python线程):
def test_zmq_inverted_pub_sub():
import zmq
import time
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
pub = ctx.socket(zmq.PUB)
sub.bind('tcp://127.0.0.1:5555')
sub.setsockopt(zmq.SUBSCRIBE, b'')
time.sleep(3)
pub.connect('tcp://127.0.0.1:5555')
pub.send(b'0')
assert sub.poll(3)
当我将zmq升级到13.1.0(现在升级到14.0.0)时,我发现此测试不起作用。
我尝试搜索有关它的一些更改,但我没有找到。 当我在不同的进程上创建这个队列时,它可以工作,但我不想为我的测试打开新的进程。有什么解释为什么它不起作用我怎么能做这个测试呢?
感谢。
答案 0 :(得分:1)
这主要是因为订阅是从zeromq 3.0开始过滤的PUB端。订阅传播需要有限的时间,因此您在建立连接后尝试立即发送的事实意味着您可能在PUB套接字知道它有任何订阅者之前发送。
有一个次要问题是known bug, 特定于SUB绑定和PUB连接时。结果是SUB套接字在建立连接后第一次轮询/ recvs 时才告诉PUB它的订阅。
此版本的测试将通过:
def test_zmq_inverted_pub_sub():
import zmq
import time
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
pub = ctx.socket(zmq.PUB)
sub.bind('tcp://127.0.0.1:5555')
sub.setsockopt(zmq.SUBSCRIBE, b'')
pub.connect('tcp://127.0.0.1:5555')
# the first sub.poll is a workaround to force subscription propagation
for i in range(2):
pub.send(b'hi')
evt = sub.poll(1)
if evt:
break
assert evt