首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理-处理数量对处理时间的影响

多处理-处理数量对处理时间的影响
EN

Stack Overflow用户
提问于 2018-06-19 11:27:18
回答 1查看 274关注 0票数 2

这可能是一个非常愚蠢的问题,但我没有找到任何文档可以完美地回答这个问题。我正在尝试熟悉python上的multiprocessing库,尝试使用multiprocessing.Pool执行滑翔伞任务。我使用:Pool(processes=nmbr_of_processes)初始化我的池中的进程数。问题是,我不能确切地理解这个数量的进程是如何减少工作时间的。我写了一个脚本来评估它。

代码语言:javascript
复制
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))

问题是,当我在mp.Pool(processes=2)中使用两个进程时,我通常会得到:

代码语言:javascript
复制
Parallel took 5.162384271621704 seconds
Serial took 9.853888034820557 seconds

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

代码语言:javascript
复制
Parallel took 6.404058218002319 seconds
Serial took 9.667300701141357 seconds

我正在开发一台MacMini DualCore i7 3Ghz。我知道我不能将工作时间减少到连续工作所需时间的一半。但我不明白为什么添加更多的进程会增加工作持续时间,而不是两个进程的工作。如果根据cpu的不同,有一个最佳的启动进程数,那么它会是多少呢?

EN

回答 1

Stack Overflow用户

发布于 2018-06-19 12:48:58

这里需要注意的是,这适用于CPU密集型任务;您的代码占用了大量CPU资源。要做的第一件事是检查你有多少理论核心:

代码语言:javascript
复制
import multiprocessing as mp
print(mp.cpu_count())

对于这样的CPU密集型任务,创建一个具有比理论核心更多的工作线程池是没有好处的。如果你不指定Pool的大小,它将默认回到这个数字。然而,这忽略了其他一些东西;您的代码并不是您的操作系统必须运行的唯一内容。

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

我惊讶地发现,我发现的其他答案并没有提到这个一般规则;它似乎仅限于注释等。然而,您自己的测试表明,它适用于您的情况下的性能,因此是确定池大小的合理启发式方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50920203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档