使用子进程模块,我正在并行运行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可执行文件中获取的)?
答案 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可执行文件中获取的)?
如上所述,这与睡眠的实施无关。