簡體   English   中英

ZeroMQ發布訂戶

[英]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_sendsocket_recv上使用bind()會導致地址已使用的錯誤)。

關於如何解決這個問題的任何想法嗎? 我有多個客戶端將消息寫入pub-sub消息總線,然后我使用呼吸機示例將消息分發給工作人員,然后這些工作人員寫回呼吸機,然后將結果發送回客戶端(工作人員-呼吸機通信是不同的溝通)。 也許有更好的溝通方式可以解決這個問題...

您幾乎總是想運行一個您想首先使用的模式的現成示例,只是為了確認一切似乎都正常。 不幸的是,我在pyzmq(我假設您正在使用的綁定)中都沒有在同一線程中使用pub / sub看到任何現成的示例,但是我已經看到並以其他語言運行了這樣的示例,所以沒有ZMQ的限制,在您的情況下應該是可能的。

您需要看幾件事。 您的代碼示例非常稀疏,任何人都無法診斷由此產生的后果,但是這里有一些建議:

  • 在嘗試訂閱特定主題(在您的情況下為“ id1”)之前,請嘗試訂閱所有內容socket_recv.setsockopt(zmq.SUBSCRIBE, "") -這將消除您未正確設置訂閱的可能性。
  • 同樣,當您確實訂閱“ id1”時,請確保您的消息是以字符串“ id1”開頭的單幀消息,還是以“ id1”作為第一幀的多幀消息。
  • 我假設所有這些都在同步上下文中運行,這意味着您的訂戶應該在繼續進行下一行之前完成連接,但是請確保這是正確的...如果您應該在訂戶完成之前開始發布消息連接,該消息將丟失。

正如您所注意到的,您不能在同一地址上兩次bind() ,請記住這一點。 您想將套接字對的一側視為“服務器”(這實際上意味着常量元素),而將另一側視為“客戶端”(這實際上意味着不穩定的元素)……如果它們兩者都一樣恆定且可靠。選擇一個“擁有”或“創建”數據的對象(在pub / sub中,它始終是發布者),然后將其中一個標記為“服務器” ...您要在其上bind()您的服務器,以及客戶端上的connect()

所有這些……正如sberry所指出的那樣,您建議的用例是雙向通信,似乎不適合pub / sub。 這樣做有你想在做什么的例子很多指導 ,具體看可靠的請求/應答模式 您的用例非常相似,以至於您可能希望使用其中之一作為基礎,並且在這些模式的描述中都鏈接了python代碼,這將有助於您了解哪個代碼在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM