我想从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