2010-11-03 58 views
2

用例如下: 我有一個腳本運行一系列非python可執行文件以減少(pulsar)數據。我現在使用 subprocess.Popen(...,shell = True),然後子進程的通信函數 從非python可執行文件捕獲標準輸出和標準錯誤,並使用python日誌記錄模塊。python隊列併發進程管理

問題是:只有一個可能的8核心現在大部分時間都在使用。 我想生成多個進程,每個進程並行執行數據集的一部分,我想跟蹤進度。這是一個用於分析低頻射電望遠鏡(LOFAR)數據的腳本/程序。更容易安裝/管理和測試更好。 我正在構建代碼來管理所有這些,但我確定它必須已經存在一些簡單的庫形式。

+0

「運行一系列非python可執行文件」所有在同一時間?或連續?請包含一段工作代碼來解釋你在做什麼。 – 2010-11-03 11:07:04

回答

2

subprocess模塊可以爲你啓動多個進程就好了,並跟蹤它們。但是,問題是讀取每個進程的輸出而不阻塞任何其他進程。根據平臺的不同,有幾種方法:使用select模塊查看哪個進程有數據要讀取,使用fnctl模塊將輸出管道設置爲非阻塞模式,使用線程讀取每個進程的數據(其中使用了subprocess.Popen.communicate自身Windows,因爲它沒有其他兩個選項。)但是,在每種情況下,魔鬼都在細節中。

東西處理這一切對你來說是Twisted,只要你想,可以釀出儘可能多的進程,並可以調用與他們產生的數據的回調(以及其他情形。)

2

也許Celery將滿足您的需求。

0

如果我理解正確你在做什麼,我可能會建議一個稍微不同的方法。嘗試建立一個單一的工作單元作爲一個功能,然後在這之後進行並行處理。例如:

  1. 將當前功能(調用子進程和捕獲輸出)封裝到一個函數中。讓函數創建一個可以返回的結果對象;或者,該功能可以寫出你認爲合適的文件。
  2. 創建一個可迭代(列表等),其包含用於每個數據塊爲第1步
  3. 輸入創建一個多處理池,然後它的地圖上利用()功能從每個步驟1執行的功能步驟2中的項目。有關詳細信息,請參閱python多處理文檔。

您也可以使用worker/Queue模型。我認爲,關鍵是將當前的子進程/輸出捕獲內容封裝到一個爲單個數據塊(不管是什麼)執行工作的函數中。然後使用幾種技術中的任何一種技術很容易地在並行處理部分上進行分層,這裏僅描述了其中的一些。

+0

問題是代碼必須在具有python 2.5的集羣計算機上運行,​​並且多處理模塊在2.6以後使用python。 :/ – Stephan 2010-11-04 10:55:13

+0

在您的主目錄中安裝python幾乎是微不足道的,而是使用那個。也就是說,如果你在一個集羣上,那麼你可能有其他的選擇,包括批量提交到一個排隊系統。 – seandavi 2010-11-05 11:57:13