我应该并行运行多少个进程?

use*_*r89 9 multiprocessing python-2.7

我有一个并行化的任务,从多个文件中读取内容,并将信息写入多个文件.

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

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

for process in listOfProcesses:
    process.join()
Run Code Online (Sandbox Code Playgroud)

值得注意的是,somethingThatReadsFromAFileAndWritesSomeStuffOut它本身可以并行化任务(它可能必须从其他文件中读取等等).

现在,正如您所看到的,正在创建的进程数量不依赖于我在计算机上拥有的核心数量或其他任何内容,除了需要完成的任务数量.如果需要运行十个任务,请创建十个进程,依此类推.

这是创建任务的最佳方式吗?我应该考虑一下我的处理器有多少核心,等等?

unu*_*tbu 26

始终将进程数与任务数分开.没有理由认为两者应该是相同的,并且通过使流程数量成为变量,您可以尝试查看哪些方法适用于您的特定问题.没有理论上的答案和老式的实际数据基准测试一样好.

以下是使用多处理池执行此操作的方法:

import multiprocessing as mp

num_workers = mp.cpu_count()  

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

pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)

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设备.在这种情况下,不可能并发,在这种情况下使用多处理可能比等效的顺序代码慢.

  • 啊,我想我明白了。我不想像学习“如果问题受 CPU 限制……”、“如果问题受 IO 限制……”等内容那样预测性能。 (2认同)
  • 想一想写入文件时会发生什么.子进程执行`f.write`,并等待IO完成.您的操作系统可能会将该核心切换到另一个子进程 该子流程可能有也可能没有用处.假设它也想执行IO.如果您有多个具有多个读/写磁头的磁盘,也许它也可以启动一些有用的工作.当它阻止等待其IO完成时,操作系统可以将该核心切换到另一个子进程.在*IO设备*无法再处理更多并发任务之前,您将继续获得性能提升. (2认同)
  • 切线,但值得注意的是:如果涉及顶级多处理的函数可能会产生自己的进程,则需要子类化“multiprocessing.pool.Pool”以使第一个池的进程非守护进程。请参阅[此答案](http://stackoverflow.com/a/8963618/2069350)。 (2认同)