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设备.在这种情况下,不可能并发,在这种情况下使用多处理可能比等效的顺序代码慢.
| 归档时间: |
|
| 查看次数: |
11635 次 |
| 最近记录: |