2013-12-15 45 views
1

我想複製ZMQ指南中描述的呼吸機/工人/水槽範例。我擁有與ZMQ示例中描述的相同的Python呼吸機,相同的C++工作人員以及相同的Python接收器。我想從一個主python腳本啓動呼吸機,工作人員和接收器,因此我在通風器周圍創建了「類」包裝,並且這兩個類都是Python模塊「multiprocessing.Process」的子類。由於C++是一個二進制文件,我使用Python的subprocess.Popen調用來啓動它。zmq呼吸機/工人/水槽範例不工作瓦特/子流程

啓動所有的這件事的順序如下:

h = subprocess.Popen('test') # test is the name of the binary 
time.sleep(1) 
s = sinkObj.start() 
time.sleep(1) 
v = ventObj.start() 

什麼我發現是沒有數據通過該系統獲取,當我開始了這樣的組件。但是,如果我在其自己的shell中啓動C++二進制文件,並且只從主python腳本啓動sinkObj和ventObj,則它工作正常。

如果這是一個Python問題而不是ZMQ問題,我提前表示歉意,但是我還沒有遇到類似這樣的問題,因爲它有Python的子進程。我也嘗試使用os.system()而不是子進程...但同樣的問題。我把所有的代碼放在這個網站上:https://github.com/kkarrancsu/zmqtest如果有人想好好測試一下。這個git有一個自述文件,告訴你這些文件是什麼。

關於爲什麼會發生這種情況的任何想法?

------------------------- UPDATE --------------------

我發現如果我創建一個簡單啓動C二進制文件的shell腳本,並調用該shell腳本w/os.system('run_the_shell_script'),它就可以工作!所以這意味着我使用subprocess.Popen(...)的方式出了問題,但似乎無法查明問題所在。我嘗試了w/the shell = True標誌,但它仍然掛着...

回答

0

正如我所見,呼吸機和接收器bind()到端口6557和6558,以及C++應用程序connect()到這些端口。在這種情況下,如果您首先啓動cpp應用程序,它將嘗試將connect()添加到端點,但由於沒有綁定在那裏,它會靜默放置。 在ZeroMQ中,基本原理是「先綁定,然後連接」。所以你不應該connect()之前你bind()東西在插座上。想象一下bind()是'服務器',而connect()是客戶端。您無法將客戶端連接到不存在的服務器。另外,在ZeroMQ中,每個套接字可以是'服務器',但是每個URL只能有1個綁定()套接字。你可以有多個'connect()'。

+0

我試着通過移動'subprocess.Popen'代碼(啓動調用'connect()'後啓動呼吸機和接收機(綁定)的C++二進制文件,但仍然是相同的問題。直到我用'subprocess.Popen'從python啓動C++二進制文件 –

1

這是導致問題的worker二進制文件的名稱。

有兩種解決方法:

  • 昌二進制文件測試test_new,做同樣的在你的All.py文件,然後你的願望,將工作名稱。
  • 替代subprocess.Popen('./test', shell=True)對於subprocess.Popen('test', shell=True)

test是Linux命令。如果在您的外殼中輸入以下內容:

$ echo $PATH 

您可能會看到.位於最後位置。這意味着,直到shell找不到要在$ PATH指示的目錄中執行的二進制文件,它纔會嘗試在當前目錄中搜索它.
當您執行subprocess.Popen('test', shell=True)時,它可能會在嘗試.之前找到它目錄,所以它不會執行workers