gpt4 book ai didi

python - multiprocessing - 进程数对处理时间的影响

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:06 25 4
gpt4 key购买 nike

这可能是一个非常愚蠢的问题,但我没有找到任何文档可以完美地回答这个问题。我正在尝试熟悉 python 上的 multiprocessing 库尝试使用 multiprocessing.Pool 进行滑翔任务。我通过以下方式启动池中的进程数:池(进程=nmbr_of_processes)。问题是我不明白这些过程是如何减少工作持续时间的。我写了一个脚本来评估它。

def test_operation(y):
sum = 0
for x in range(1000):
sum += y*x


def main():
time1 = time.time()
p = mp.Pool(processes=2)
result = p.map(test_operation, range(100000))
p.close()
p.join()

print('Parallel tooks {} seconds'.format(time.time() - time1))

final = list()
time2 = time.time()
for y in range(100000):
final.append(test_operation(y))
print('Serial tooks {} seconds'.format(time.time() - time2))

问题是,当我将 2 个进程与 mp.Pool(processes=2) 一起使用时,我通常会得到:

Parallel took 5.162384271621704 seconds
Serial took 9.853888034820557 seconds

如果我使用更多进程,比如 p = mp.Pool(processes=4)我得到:

Parallel took 6.404058218002319 seconds
Serial took 9.667300701141357 seconds

我正在使用 MacMini DualCore i7 3Ghz。我知道我无法将工作持续时间减少到连续工作所需时间的一半。但我不明白为什么与使用 2 个进程的工作相比,添加更多进程会增加工作持续时间。如果根据 CPU 启动最佳进程数,那会是多少?

最佳答案

这里要注意的是,这适用于 CPU 密集型任务;您的代码占用大量 CPU。首先要做的是检查你有多少理论核心:

import multiprocessing as mp
print(mp.cpu_count())

对于像这样的受 CPU 限制的任务,创建一个工作线程数多于理论内核数的池不会带来任何好处。如果您没有指定 Pool 的大小,它将默认返回到这个数字。但是,这忽略了其他事情;您的代码不是您的操作系统必须运行的唯一东西。

如果您启动与理论核心一样多的进程,系统别无选择,只能定期中断您的进程以保持运行,因此您可能会受到性能影响。你不能独占所有核心。这里的一般经验法则是池大小为 cpu_count() - 1,这样操作系统就有一个核心可以免费用于其他进程。

我很惊讶地发现我找到的其他答案没有提到这个一般规则;它似乎仅限于评论等。但是,您自己的测试表明它适用于您案例中的性能,因此是确定池大小的合理启发式方法。

关于python - multiprocessing - 进程数对处理时间的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50920203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com