2012-03-28 90 views
4

我有一個二進制文件(比如a.out),我想用不同的配置調用。我想在並行的40核心機器上運行這些配置。下面是我的代碼草圖。Python多處理+子進程問題

這非常簡單:我生成一個配置並傳入worker,並且worker使用子進程使用config調用二進制。我也將輸出重定向到一個文件。讓我們把這段代碼run.py

def worker(cmdlist, filename): 
    outputfile = open(filename, 'wb') 
    // here it essentially executes a.out config > outputfile 
    subprocess.call(cmdlist, stderr=outputfile, stdout=outputfile) 
    outputfile.close() 

def main(): 
    pool = Pool(processes = 40) 
    for config in all_configs 
     filename, cmdlist = genCmd(config) 
     res = pool.apply_async(worker, [cmdlist, filename]) 
     results.append(res) 
    for res in results: 
     res.get() 
    pool.close() 

但經過我踢它的時候,我意識到,我,因爲我想我不是產卵儘可能多的進程。我絕對提交了40多名工作人員,但最重要的是,我只看到約20人。

我看到許多處於「睡眠」狀態(即頂部的「S」)的run.py。當我執行ps auf時,我還看到很多run.py在「S +」狀態,沒有生成二進制文件。其中只有一半產生了「a.out」

我在想,爲什麼會發生這種情況?我正在將輸出重定向到一個網絡硬盤,這可能是一個原因,但是最重要的是我只看到了10%(根據我的理解,10%是等待IO)。我不認爲這會導致50%的空閒CPU。另外,我應該至少有二進制產生,而不是卡住在run.py。我的二進制文件的運行時間也足夠長。我真的應該看到長時間運行40個工作。

有沒有其他解釋?任何我在我的Python代碼中做錯了?

+1

你在all_configs中有多少個配置? – JoshRagem 2012-03-28 03:54:59

+0

@JoshRagem遠遠超過40個,正如我在原始問題中所說的 – CodeNoob 2012-03-28 04:15:46

+0

嘗試向a.out添加顯着的延遲。 – alexander 2012-03-28 04:19:28

回答

1

我曾經使用過多個同時在多個內核上運行的進程的方法是使用p = subprocess.Popen(...)和p.Poll()。在你的情況下,我認爲你可以完全跳過使用Pool。我會給你一個更好的例子,但不幸的是我無法再訪問該代碼。