睡眠的并行调用不会加起来

时间:2016-07-26 20:48:30

标签: python multithreading optimization

使用子进程模块,我正在并行运行1000次sleep(1)调用:

import subprocess
import time
start = time.clock()

procs = []
for _ in range(1000):
    proc = subprocess.Popen(["sleep.exe", "1"])
    procs.append(proc)

for proc in procs:
    proc.communicate()

end = time.clock()
print("Executed in %.2f seconds" % (end - start))

在我的4核机器上,这导致执行时间为几秒,远远低于我的预期(~1000s / 4)。

如何优化它?它是否依赖于睡眠实现(这个是从Windows-Git可执行文件中获取的)?

2 个答案:

答案 0 :(得分:2)

睡眠不需要任何处理器时间,因此您的操作系统一次可以运行4个以上的睡眠请求,即使它只有4个核心。理想情况下,它只能在1秒内处理整批1000,但是在创建和拆除各个流程时会有很多开销。

答案 1 :(得分:1)

这是因为subprocess.Popen(..) 不是阻止通话。该线程只是触发子进程创建并继续前进。它不等待它完成。

换句话说,您在循环中生成1000个异步进程,然后逐个等待它们。此异步行为会导致您的整体运行时间为几秒钟。

调用proc.communicate()等待子进程完成(已退出)。现在,如果您希望将睡眠时间加起来(减去流程创建/销毁)开销,您可以这样做:

import subprocess
import time
start = time.clock()

procs = []

#Get the start time
for _ in range(10):
    proc = subprocess.Popen(["sleep.exe", "1"])
    procs.append(proc)
    proc.communicate()

#Get the end time
  

它是否依赖于睡眠实现(这个是从Windows-Git可执行文件中获取的)?

如上所述,这与睡眠的实施无关。