繁体   English   中英

多核上的批处理

[英]Batch processing on multiple cores

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

  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等)。

我该如何实现这一目标? 我对multiprocessing.Pool()multiprocessing.Process()和其他各种选项感到困惑。

谢谢。

为了演示Pool我假设您的工作函数(使用文件名并生成一个数字)被命名为work ,并且20个文件标记为1.txt ,... 20.txt 设置它的一种方法如下,

from multiprocessing import Pool

pool = Pool(processes=4)
result = pool.map_async(work, ("%d.txt"%n for n in xrange(1,21)))
print sum(result.get())

此方法将为您完成步骤3和4的工作。

这很简单。

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__': 如果没有,你将制作一个叉炸弹并锁定你的电脑。

虽然Jared的答案很棒,但我个人会使用futures模块中的ProcessPoolExecutor ,甚至不用担心multiprocessing

with ProcessPoolExecutor(max_workers=4) as executor:
    result = sum(executor.map(process_file, files))

当它变得有点复杂时, future对象,或者futures.as_completed ,与multiprocessing等价物相比可以非常漂亮。 当它变得更加复杂时, multiprocessing就变得更加灵活和强大。 但是,当这是微不足道的时候,真的,几乎很难分辨出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM