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

标签 python-2.7 multiprocessing

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

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

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

for process in listOfProcesses:
    process.join()

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

现在,如您所见,创建的进程数不取决于我计算机上的内核数或其他任何东西,除了需要完成多少任务。如果需要运行十个任务,则创建十个进程,以此类推。

这是创建任务的最佳方式吗?我是否应该考虑我的处理器有多少个内核等?

最佳答案

始终将进程数与任务数分开。没有理由为什么两者应该相同,并且通过将进程数设为变量,您可以进行试验以查看对您的特定问题有效的方法。没有什么理论答案能像老式的用真实数据进行的“弄脏你的手”基准测试一样好。

以下是使用多处理池的方法:

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

关于python-2.7 - 我应该并行运行多少个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816546/

相关文章:

multithreading - 如何在后台运行 tshark 命令并使用 python 中的子进程退出它

python-2.7 - 根据空列数移动 pandas 列

python - 在 raw_input 中输入 float 、整数或方程来定义变量

multiprocessing - 破管错误 : [WinError 109] The pipe has been ended during data extraction

python - 为进程指定特定的CPU - python multiprocessing

python - 在没有继承的情况下在多个进程之间共享numpy数组

Python 多处理队列 : what to do when the receiving process quits?

python - 使用 pip 安装 Nose ,但 bash 无法识别 mac 上的命令

python - 使用 python 多处理时,mysql 得到不同的结果

Python,使用CRLF按原样读取CRLF文本文件