5

我想对多个核心上的文件进行批处理。我有以下情况:

  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()和其他各种选项感到困惑。

谢谢。

4

3 回答 3

7

为了演示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 的工作。

于 2013-04-12T23:03:09.367 回答
3

这很简单。

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__':. 如果没有,您将制造一个叉子炸弹并锁定您的计算机。

于 2013-04-12T23:06:48.927 回答
2

尽管 Jared 的回答很棒,但我个人会使用模块中的 a ProcessPoolExecutorfutures甚至不用担心multiprocessing

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

当它变得更复杂一点时,与等价物相比,future对象 orfutures.as_completed可能真的很漂亮。multiprocessing当它变得更复杂时,它会变得multiprocessing更加灵活和强大。但是,当它是如此微不足道时,真的,几乎很难区分。

于 2013-04-12T23:18:15.740 回答