我有一個二進制文件(比如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代碼中做錯了?
你在all_configs中有多少個配置? – JoshRagem 2012-03-28 03:54:59
@JoshRagem遠遠超過40個,正如我在原始問題中所說的 – CodeNoob 2012-03-28 04:15:46
嘗試向a.out添加顯着的延遲。 – alexander 2012-03-28 04:19:28