我想在多个核心上批量处理文件。我有以下情况:
我如何实现这一目标?我对multiprocessing.Pool()
,multiprocessing.Process()
以及其他各种选项感到困惑。
感谢。
答案 0 :(得分:7)
为了演示Pool
我假设您的工作函数(使用文件名并生成数字)被命名为work
,并且20个文件被标记为{{1} },... 1.txt
。设置它的一种方法如下,
20.txt
此方法将为您完成步骤3和4的工作。
答案 1 :(得分:2)
这很简单。
from multiprocessing import Pool
def process_file(filename):
return filename
if __name__ == '__main__':
pool = Pool()
files = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
results = pool.imap(process_file, files)
for result in results:
print result
Pool
会自动默认为您拥有的处理器核心数。此外,请确保您的处理功能可从文件导入,并且您的多处理代码位于if __name__ == '__main__':
内。如果没有,你将制作一个叉炸弹并锁定你的电脑。
答案 2 :(得分:2)
虽然Jared的答案很棒,但我个人会使用futures
模块中的ProcessPoolExecutor
,甚至不用担心multiprocessing
:
with ProcessPoolExecutor(max_workers=4) as executor:
result = sum(executor.map(process_file, files))
当它变得更复杂时,与future
等价物相比,futures.as_completed
对象或multiprocessing
可能非常漂亮。当它变得更加复杂时,multiprocessing
更加灵活和强大。但是,当这是微不足道的时候,真的,几乎很难分辨出来。