我想從Python爲大約8000個文件啓動外部命令。每個文件都是獨立處理的。唯一的限制是所有文件都被處理後繼續執行。我有4個物理核心,每個核心有2個邏輯核心(multiprocessing.cpu_count()
返回8)。我的想法是使用四個並行獨立進程池,這些進程將在8個內核中的4個內核上運行。這樣我的機器在此期間應該可以使用。使用外部命令多處理數千個文件
這是我一直在做的事情:
import multiprocessing
import subprocess
import os
from multiprocessing.pool import ThreadPool
def process_files(input_dir, output_dir, option):
pool = ThreadPool(multiprocessing.cpu_count()/2)
for filename in os.listdir(input_dir): # about 8000 files
f_in = os.path.join(input_dir, filename)
f_out = os.path.join(output_dir, filename)
cmd = ['molconvert', option, f_in, '-o', f_out]
pool.apply_async(subprocess.Popen, (cmd,))
pool.close()
pool.join()
def main():
process_files('dir1', 'dir2', 'mol:H')
do_some_stuff('dir2')
process_files('dir2', 'dir3', 'mol:a')
do_more_stuff('dir3')
一個連續的治療需要120秒爲一個批次的100個文件。上面概述的多處理版本(功能process_files
)僅需20秒。但是,當我在整個8000個文件集上運行process_files
時,我的PC掛起並在一小時後不凍結。
我的問題是:
1)我想ThreadPool
應該初始化進程池(這裏multiprocessing.cpu_count()/2
過程,要準確)。然而,我的計算機掛在8000個文件上,但不是100個,這表明可能沒有考慮池的大小。要麼,要麼我做錯了什麼。你能解釋一下嗎?
2)這是在Python中啓動獨立進程時的正確方法,當它們每個都必須啓動一個外部命令時,並且這樣所有資源都不會被處理佔用?
我比較@larsks('ThreadPool'和'apply_async'和subprocess'call's)和@Roland Smith(使用'Popen'對象的手動池管理)提出的解決方案。我的基準測試表明'ThreadPool'解決方案在實踐中速度更快。非常感謝你們! – user3638629