我有一个并行化的任务,可以从多个文件中读取内容,并将信息写入多个文件。
我目前用来并行化东西的成语:
listOfProcesses = []
for fileToBeRead in listOfFilesToBeRead:
process = multiprocessing.Process(target = somethingThatReadsFromAFileAndWritesSomeStuffOut, args = (fileToBeRead))
process.start()
listOfProcesses.append(process)
for process in listOfProcesses:
process.join()
值得注意的是somethingThatReadsFromAFileAndWritesSomeStuffOut
本身可以并行化任务(可能需要从其他文件中读取等等)。
现在,正如您所看到的,正在创建的进程数量并不取决于我在计算机上拥有的核心数量或其他任何内容,除了需要完成的任务数量< / em>的。如果需要运行十个任务,请创建十个进程,依此类推。
这是创建任务的最佳方式吗?我应该考虑一下我的处理器有多少核心等?
答案 0 :(得分:21)
始终将进程数与任务数分开。没有理由认为两者应该是相同的,并且通过使流程数量成为变量,您可以尝试查看哪些方法适用于您的特定问题。没有理论上的答案和老式的用真实数据进行基准测试一样好。
以下是使用多处理池的方法:
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()
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设备。在这种情况下,不可能并发,在这种情况下使用多处理可能比等效的顺序代码慢。