多核上的批处理

时间:2013-04-12 22:54:49

标签: python python-2.7 multiprocessing

我想在多个核心上批量处理文件。我有以下情况:

  1. 我有20个文件。
  2. 我有一个函数,它接受一个文件名,处理它并产生一个整数结果。我想将函数应用于所有20个文件,计算每个文件的整数输出,最后对各个输出求和并打印总结果。
  3. 由于我有4个核心,我只能处理4个文件。因此,我希望一次运行5轮处理4个文件(4 * 5 = 20)。
  4. 那就是我要创建4个进程,每个进程一个接一个地处理5个文件(第一个进程处理文件0,4,8,12,16,第二个进程处理文件1,5,9,13,17等)
  5. 我如何实现这一目标?我对multiprocessing.Pool()multiprocessing.Process()以及其他各种选项感到困惑。

    感谢。

3 个答案:

答案 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更加灵活和强大。但是,当这是微不足道的时候,真的,几乎很难分辨出来。