2014-05-22 49 views
1

我有一个并行任务,它从多个文件中读取内容,并将其写入多个文件。我应该并行运行多少个进程?

我目前使用的并行化的东西的成语:

listOfProcesses = [] 
for fileToBeRead in listOfFilesToBeRead: 
    process = multiprocessing.Process(target = somethingThatReadsFromAFileAndWritesSomeStuffOut, args = (fileToBeRead)) 
    process.start() 
    listOfProcesses.append(process) 

for process in listOfProcesses: 
    process.join() 

值得注意的是somethingThatReadsFromAFileAndWritesSomeStuffOut本身可能并行任务(也可能有其他的文件,等等,等等看)。

现在,您可以看到,创建的进程数量不取决于我的计算机上的内核数量或其他任何内容,除了需要完成多少任务。如果需要运行10个任务,则创建10个进程等。

这是创建任务的最佳方法是什么?我应该考虑一下我的处理器有多少个内核?

+0

这肯定不是多个进程越好。但是你应该考虑的另一件事是,创建额外的流程是否有意义。除非您对这些文件执行大量(CPU密集型)处理,否则这种情况很可能是I/O限制的。在这种情况下,Python线程将做的很好。 –

回答

8

始终工序数从任务的数量分开。没有理由为什么这两者应该是相同的,并且通过使进程的数量变化,您可以尝试查看哪些对您的特定问题有效。没有理论上的答案比老式的用真实数据得到你的手脏的基准。

这里是你如何能使用多处理池做到这一点:

import multiprocessing as mp 

num_workers = mp.cpu_count() 

pool = mp.Pool(num_workers) 
for task in tasks: 
    pool.apply_async(target = func, args = (task,)) 

pool.close() 
pool.join() 

pool = mp.Pool(num_workers)将创建子进程num_workers池。 num_workers = mp.cpu_count()将设置num_workers等于CPU核心的数量。您可以通过更改此号码进行试验。 (注意:pool = mp.Pool()创建的N子过程,其中N等于 mp.cpu_count()默认池)

如果一个问题是CPU密集型的,还有就是设置num_workers了一些比核心数量更大的任何好处,因为该机器不能有比核心数量更多的并行操作进程。此外,如果num_workers超过内核数量,在进程之间切换可能会使性能变差。

如果一个问题是IO的限制 - 这你可能是因为他们在做文件IO - 它可能是有意义的有num_workers超过核心数量,如果你的IO设备(一个或多个)可以处理更多并发任务比你有核心。但是,如果您的IO本质上是连续的 - 例如,如果只有一个硬盘驱动器只有一个读/写头 - 则除了一个子过程外,其他所有子过程都可能被阻塞,等待IO设备。在这种情况下,没有并发性是可能的,在这种情况下使用多处理可能比等效的顺序代码慢。

+0

“没有理论上的答案像老式的用真实的数据得到你的手脏的基准一样好。”这是没有意义的。 – user89

+0

如果您知道如何在没有基准测试的情况下预测绩效,那么您可以获得更多的权力。我根本不知道任何可靠的未经测试的预测方法。 – unutbu

+0

啊,我想我明白了。我不想预测性能,就像学习诸如“如果一个问题是CPU限制的......”,“如果问题是IO限制......”“等等。 – user89

相关问题