2012-10-01 75 views
2

我試圖在python中使用zeromq在debian/multiprocess情況。我有幾個進程解碼來自多個傳感器的原始數據,並在zmq中發佈。到現在爲止還挺好。 我有一個計算過程,它訂閱zmq上的原始數據,並執行一些計算。然後它需要發佈其他進程的答案來記錄和使用。因此我的計算過程需要在同一過程中訂閱和發佈。zeromq訂閱和同時發佈

import zmq 
import json 
context = zmq.Context() 

sub = context.socket(zmq.SUB) 
sub.setsockopt(zmq.SUBSCRIBE, '') 
sub.setsockopt(zmq.RCVBUF, 0) 
sub.bind("tcp://127.0.0.1:5000") 

pub = context.socket(zmq.PUB) 
pub.bind("tcp://127.0.0.1:5000") 

我試過以上,但沒有運氣。它返回一個ERR ...

File "socket.pyx", line 465, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4749) 
zmq.core.error.ZMQError: Address already in use 

我閱讀文檔,谷歌等,但現在完全被卡住。

回答

2

您試圖綁定到相同的端口(5000)兩次,這會給您提供Address already in use錯誤 - 您只能將一個套接字綁定到端口。

sub插座不應bind(),它應該做一個connect()到另一個進程被髮布到一些主機/端口(即做對bind())。該代碼應該是這個樣子:

sub = context.socket(zmq.SUB) 
sub.setsockopt(zmq.SUBSCRIBE, '') 
sub.setsockopt(zmq.RCVBUF, 0) 
sub.connect("tcp://127.0.0.1:XXXX") 

pub = context.socket(zmq.PUB) 
pub.bind("tcp://127.0.0.1:YYYY") 

我猜,你不是說有口XXXXYYYY相同的,那麼同樣的過程會聽它本身發佈的消息。

+0

嗨,感謝您的提示。我會在今晚嘗試。是的,我確實想使用一個公共端口,這意味着所有的流量都在1端口上。這使得所有其他進程更容易,因爲它們只需要偵聽1端口。我想我可以使用多個端口,但這很快就會變得非常困難,因爲我有幾十個進程,每個進程訂閱,執行特定的任務,然後將結果發佈給多個消費者。那些消費者每個都做別的事情(webUI,額外的處理,日誌記錄等) – pktrigg

+0

然後確保你在這個進程中的用戶之前啓動發佈者,否則'connect()'將不能連接到這個端口。 – johlo

+0

嗨,我給了一個旋轉。它看起來像你對bind/socket的建議,並且順序起作用,但是我還需要訂閱的其他進程無法綁定(正如你指出的那樣,每個端口只有1個套接字),這意味着我仍然卡住。也許我應該使用pgm多播而不是tcp套接字?我非常確定zmq可以做到這一點,但我無法弄清楚或找到如何使它發生。 – pktrigg