[英]ZeroMQ publishing subscriber
是否可以在一個線程中擁有發布者和訂閱者? 每當我做
socket_send = context.socket(zmq.PUB)
socket_send.bind("tcp://127.0.0.1:5559")
socket_recv = context.socket(zmq.SUB)
socket_recv.connect("tcp://127.0.0.1:5559")
socket_recv.setsockopt(zmq.SUBSCRIBE, "id1")
訂閱無效(即消息未到達)。 當我使用socket_recv.bind()
,發送不起作用bind()
在socket_send
和socket_recv
上使用bind()
會導致地址已使用的錯誤)。
關於如何解決這個問題的任何想法嗎? 我有多個客戶端將消息寫入pub-sub消息總線,然后我使用呼吸機示例將消息分發給工作人員,然后這些工作人員寫回呼吸機,然后將結果發送回客戶端(工作人員-呼吸機通信是不同的溝通)。 也許有更好的溝通方式可以解決這個問題...
您幾乎總是想運行一個您想首先使用的模式的現成示例,只是為了確認一切似乎都正常。 不幸的是,我在pyzmq(我假設您正在使用的綁定)中都沒有在同一線程中使用pub / sub看到任何現成的示例,但是我已經看到並以其他語言運行了這樣的示例,所以沒有ZMQ的限制,在您的情況下應該是可能的。
您需要看幾件事。 您的代碼示例非常稀疏,任何人都無法診斷由此產生的后果,但是這里有一些建議:
socket_recv.setsockopt(zmq.SUBSCRIBE, "")
-這將消除您未正確設置訂閱的可能性。 正如您所注意到的,您不能在同一地址上兩次bind()
,請記住這一點。 您想將套接字對的一側視為“服務器”(這實際上意味着常量元素),而將另一側視為“客戶端”(這實際上意味着不穩定的元素)……如果它們兩者都一樣恆定且可靠。選擇一個“擁有”或“創建”數據的對象(在pub / sub中,它始終是發布者),然后將其中一個標記為“服務器” ...您要在其上bind()
您的服務器,以及客戶端上的connect()
。
所有這些……正如sberry所指出的那樣,您建議的用例是雙向通信,似乎不適合pub / sub。 這樣做有你想在做什么的例子很多指導 ,具體看可靠的請求/應答模式 。 您的用例非常相似,以至於您可能希望使用其中之一作為基礎,並且在這些模式的描述中都鏈接了python代碼,這將有助於您了解哪個代碼在做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.