我一直在尝试学习使用python中的多处理模块。我似乎在这个模块中找到了一个有趣的事实,如果使用pool((函数来民谣一些子进程,似乎无论每个进程在做什么工作,完成所有进程,至少要花费0.3s,例如,如果我打印16次的东西,它将花费很少的时间, 但是如果我使用 16 个进程,每个进程打印一次,它将花费 0.3 秒,我不知道是我的代码有某种错误还是其他什么,有人可以向我解释一下,我使用的代码如下:
import time
from multiprocessing import Pool
import os
start = time.time()
def task():
print('something')
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Pool(16)
for i in range(17):
p.apply_async(task)
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
end = time.time()
print(end - start)
这 300 毫秒只是您的操作系统在系统上生成新进程所需的时间。对于这种延迟,您几乎无能为力(除了获得更快的系统(,并且它总是因系统而异。
多处理通常用于利用多个内核。在生成多个进程时,存在开销。对于小任务,多处理通常较慢。
0.3s 特定于具有当前环境的系统。它可能因以下因素而异:
- 硬件
- N 个内核繁忙
- N 个正在运行的进程
- 各种工艺亲和力
- 等
在同一个系统上,如果您将所有内核都保持忙碌到操作系统无法更快地完成的状态,那么它的成本甚至可能超过几秒钟。有点像叉子炸弹,它的行为会慢慢冻结甚至停止系统。
检查您的硬件,主要是 CPU 的物理内核并使用例如multiprocessing.cpu_count()
(或两倍于该数量,具体取决于核心线程(以实现最大效率。否则,假设您有 4 个内核,并生成了 8 个进程。每个物理核心有 2 个进程,但是您的操作系统也需要在某个地方运行,Python master 进程也需要一些东西才能运行,如果您打开了 Chrome 或 Firefox Quantum,那也有很多进程。
如果您关闭所有内容并仅保留程序(显然还有操作系统,最好以文本模式以获取更多资源(运行,您可能会获得更好的性能。
多个进程还需要一些资源,例如主进程与从进程通信,例如与套接字通信,因此在单个单线程 Python 进程上总会有一些开销。