我有一个加起来很多数字的过程:
def slow(x):
num = 0
for i in xrange(int(1E9)):
num += 1
我开始了其中的500个。
for x in range(500):
out.write("Starting slow process - " + str(datetime.now()) + "\n")
p = multiprocessing.Process(target = slow, args = (x, ))
p.start()
我希望这些进程能够立即启动,因为我的计算机允许的最大进程数大于500.
user@computer$ cat /proc/sys/kernel/pid_max
32768
但是,在一个流程的开始时间和下一个流程的开始时间之间会有短暂的延迟。
Starting slow process - 2015-05-14 16:41:35.276839
Starting slow process - 2015-05-14 16:41:35.278016
Starting slow process - 2015-05-14 16:41:35.278666
Starting slow process - 2015-05-14 16:41:35.279328
Starting slow process - 2015-05-14 16:41:35.280053
Starting slow process - 2015-05-14 16:41:35.280751
Starting slow process - 2015-05-14 16:41:35.281444
Starting slow process - 2015-05-14 16:41:35.282094
Starting slow process - 2015-05-14 16:41:35.282720
Starting slow process - 2015-05-14 16:41:35.283364
随着我们开始更多流程,这种延迟会变得更长:
Starting slow process - 2015-05-14 16:43:40.572051
Starting slow process - 2015-05-14 16:43:41.630004
Starting slow process - 2015-05-14 16:43:42.716438
Starting slow process - 2015-05-14 16:43:43.270189
Starting slow process - 2015-05-14 16:43:44.336397
Starting slow process - 2015-05-14 16:43:44.861934
Starting slow process - 2015-05-14 16:43:45.948424
Starting slow process - 2015-05-14 16:43:46.514324
Starting slow process - 2015-05-14 16:43:47.516960
Starting slow process - 2015-05-14 16:43:48.051986
Starting slow process - 2015-05-14 16:43:49.145923
Starting slow process - 2015-05-14 16:43:50.228910
Starting slow process - 2015-05-14 16:43:50.236215
可能导致这种现象的原因是什么?
答案 0 :(得分:3)
您正在开始500个流程;每个你要求旋转的数量达到一百万。我不确定为什么这需要时间让你感到惊讶?
即使没有做任何事情,启动500个进程也需要花费一些时间,但是当他们每个人使用python计数到一百万时,这几乎是一两秒就会过去。这些其他进程现在将争夺CPU时间,并且不会给出产生该进程的进程赢得此竞赛并立即生成其余进程。
编辑:你也正在拨打500个电话给系统以获得现在的时间并打印出来,这也需要一些时间,如果你打印的时间只在你开始和产卵的时候,我怀疑它也加速了。
我怀疑如果用睡眠呼叫或类似的东西替换计数循环会更快,因此你所看到的并不是真正开始进程的时间。
答案 1 :(得分:2)
根据@ Agrajag的建议对代码进行了一些更改,至少在我的系统上,这些建议证实了他的怀疑。
out
的IO开销。import sys
import time
import multiprocessing
from datetime import datetime
def slow(x):
time.sleep(10)
num = 0
for i in xrange(int(1E9)):
num += 1
times = []
for x in range(500):
times.append(datetime.now())
p = multiprocessing.Process(target = slow, args = (x, ))
p.start()
for x in times:
sys.stdout.write("Starting slow process - " + str(x) + "\n")
Starting slow process - 2015-05-18 04:17:02.557117
Starting slow process - 2015-05-18 04:17:02.574186
Starting slow process - 2015-05-18 04:17:02.594736
Starting slow process - 2015-05-18 04:17:02.616716
Starting slow process - 2015-05-18 04:17:02.637369
Starting slow process - 2015-05-18 04:17:02.658615
Starting slow process - 2015-05-18 04:17:02.675418
Starting slow process - 2015-05-18 04:17:02.696439
Starting slow process - 2015-05-18 04:17:02.713795
Starting slow process - 2015-05-18 04:17:02.734777
Starting slow process - 2015-05-18 04:17:02.753063
答案 2 :(得分:1)
您的计算机并不像运行CPU核心那样运行更多进程。通常,这不是什么大问题,因为没有一个进程占用CPU。根据{{3}},操作可以愉快地依次为每个流程分配资源。
当很多进程确实需要 CPU时,糟糕的事情就会开始发生。操作系统尽力而为,但事情可能会放缓。没有任何工作能够有效地完成任务。
随着您添加更多活动流程,情况会变得更糟。为什么会这样?
嗯,其中一个因素 - 其中一个因素 - 当一个新进程接管时,CPU缓存可能会在其中包含过时的数据。 CPU具有多级缓存,可充当超快速内存。如果一个长时间运行的进程可以单独访问CPU,它将享受更快的速度,因为它将自己拥有缓存。
当进程多于CPU时,其中一些进程只在队列中等待。当操作系统分配进程CPU时间时,将加载更多内存等,从而减慢下一个人的所有内容。
哦 - 让我们不要忘记产卵过程也不是即时的。操作系统还有其他工作要做,例如确保您可以访问Internet并检查文件是否正在写入磁盘。