这可能是一个非常愚蠢的问题,但我没有找到任何医生能完美地回答这个问题。我试图熟悉python上的multiprocessing
库,尝试使用multiprocessing.Pool
进行滑翔伞任务。
我通过以下方式启动池中的进程数:
Pool(processes=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))
问题是,当我使用mp.Pool(processes=2)
的两个进程时,我通常得到:
如果我使用更多的进程,比如p = mp.Pool(processes=4)
我得到:
我正在研制MacMini DualCore i7 3Ghz。我知道我不能把工作持续时间减少到连续工作所需时间的一半。但是我不明白为什么添加更多的进程会比一个有两个进程的工作增加工作持续时间。如果根据cpu的不同,有一个最佳的启动进程数,它会是多少?在
这里需要注意的是,这适用于CPU限制的任务;您的代码对CPU的使用很重。首先要检查你有多少理论核心:
对于这样的CPU限制任务,创建一个包含比理论核心更多的工人的池没有任何好处。{t}如果不指定默认值的大小,请不要指定。然而,这忽略了其他一些东西;您的代码并不是操作系统必须运行的唯一内容。在
如果你启动的进程和理论上的核心一样多,系统别无选择,只能周期性地中断进程以保持运行,所以你很可能会受到性能的影响。你不能垄断所有的核心。这里的一般经验法则是池大小为
cpu_count() - 1
,这样操作系统就有了一个核心,可以在其他进程上使用。在我很惊讶地发现,我发现的其他答案没有提到这个一般规则;它似乎仅限于评论等。但是,您自己的测试表明,它适用于您的情况下的性能,因此确定池大小是一个合理的启发式方法。在
相关问题 更多 >
编程相关推荐