gpt4 book ai didi

Python, Multiprocessing : what does process. join() 做什么?

转载 作者:行者123 更新时间:2023-11-28 21:50:49 27 4
gpt4 key购买 nike

import time
from multiprocessing import Process

def loop(limit):
for i in xrange(limit):
pass
print i

limit = 100000000 #100 million

start = time.time()

for i in xrange(5):
p = Process(target=loop, args=(limit,))
p.start()
p.join()

end = time.time()
print end - start

我尝试运行这段代码,这是我得到的输出

99999999
99999999
2.73401999474
99999999
99999999
99999999

有时

99999999
99999999
3.72434902191
99999999
99999999
99999999
99999999
99999999

在这种情况下,循环函数被调用了 7 次而不是 5 次。为什么会出现这种奇怪的行为?

我也对 p.join() 语句的作用感到困惑。它是结束任何一个进程还是同时结束所有进程?

最佳答案

join 函数当前将等待您调用的最后一个进程完成,然后再继续下一段代码。如果您回顾一下您所做的事情,您应该明白为什么会得到“奇怪”的输出。

for i in xrange(5):
p = Process(target=loop, args=(limit,))
p.start()

这将依次启动 5 个新进程。这些都是同时运行的。 至少,由调度程序决定当前正在处理的进程。

这意味着您现在有 5 个进程在运行:

Process 1

Process 2

Process 3

Process 4

Process 5

p.join()

这要等待p进程完成 进程 5 因为这是分配给 p 的最后一个进程.

现在假设进程 2 首先完成,然后是 进程 5,这是完全可行的,因为调度程序可以为这些进程提供更多的 CPU 时间。

Process 1

Process 2 prints 99999999

Process 3

Process 4

Process 5 prints 99999999

p.join()行现在将转到下一部分 p 流程 5 已完成。

end = time.time()
print end - start

这部分打印它的部分,现在有 3 个进程在此输出后仍在继续。

其他进程完成并在那里打印 99999999。

要修复此行为,您需要 .join()所有的过程。为此,您可以将代码更改为...

processes = []

for i in xrange(5):
p = Process(target=loop, args=(limit,))
p.start()
processes.append(p)

for process in processes:
process.join()

这将等待第一个进程,然后是第二个进程,依此类推。一个进程是否先于另一个进程完成并不重要,因为在脚本继续之前必须等待列表中的每个进程。

关于Python, Multiprocessing : what does process. join() 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31386613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com