簡體   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