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

标签 python parallel-processing multiprocessing python-multiprocessing

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/

相关文章:

python - 单个变量的频率表

python - 如何通过引发异常来 pytest 一个 python 函数

multithreading - Julia 1.5.2并行启动随机数选择

c - 多个进程,一个互斥锁

python - 多处理与 NumPy 不兼容

python - Pandas:循环每一行,提取特征并创建新列

python - django 选择查询——我该怎么做?

c# - 单个线程上的线程 WaitHandle

bash - 如何循环运行固定数量的进程?

python - 使用带有关键字参数的 multiprocessing.Pool.map() 函数?