繁体   English   中英

在Python中使用反向ZeroMQ pub-sub进行测试

[英]Testing using inverted zeromq pub-sub in python

我在代码中确实使用了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)时,我看到此测试不起作用。

我尝试搜索有关它的一些更改,但没有找到。 当我在不同的流程上创建此队列时,它可以工作,但是我不想为测试打开新流程。 有什么解释为什么它不起作用以及如何正确执行此测试?

谢谢。

这主要是因为订阅是从zeromq 3.0开始在PUB端进行筛选的。 订阅传播需要花费有限的时间,因此,您在建立连接后立即尝试发送消息这一事实意味着您可能在PUB套接字知道它有任何订​​阅者之前就进行发送。

还有一个次要问题是一个已知的错误 ,特定于SUB绑定和PUB连接的时间。 结果是,SUB套接字直到建立连接后第一次轮询/接收时才向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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM