gpt4 book ai didi

python - Python 多处理模块的 .join() 方法到底在做什么?

转载 作者:IT老高 更新时间:2023-10-28 21:11:05 24 4
gpt4 key购买 nike

了解 Python Multiprocessing (来自 PMOTW article )并且希望对 join() 方法的具体作用进行一些说明。

old tutorial from 2008 中它指出如果没有下面代码中的 p.join() 调用,“子进程将处于空闲状态并且不会终止,成为必须手动杀死的僵尸”。

from multiprocessing import Process

def say_hello(name='world'):
print "Hello, %s" % name

p = Process(target=say_hello)
p.start()
p.join()

我添加了 PIDtime.sleep 的打印输出来测试,据我所知,进程自行终止:

from multiprocessing import Process
import sys
import time

def say_hello(name='world'):
print "Hello, %s" % name
print 'Starting:', p.name, p.pid
sys.stdout.flush()
print 'Exiting :', p.name, p.pid
sys.stdout.flush()
time.sleep(20)

p = Process(target=say_hello)
p.start()
# no p.join()

20 秒内:

936 ttys000    0:00.05 /Library/Frameworks/Python.framework/Versions/2.7/Reso
938 ttys000 0:00.00 /Library/Frameworks/Python.framework/Versions/2.7/Reso
947 ttys001 0:00.13 -bash

20 秒后:

947 ttys001    0:00.13 -bash

行为与在文件末尾添加的 p.join() 相同。本周 Python 模块提供 very readable explanation of the module ; “要等到进程完成其工作并退出,请使用 join() 方法。”,但似乎至少 OS X 无论如何都在这样做。

我也想知道方法的名称。 .join() 方法是否在此处连接任何内容?它是否将一个过程与它的结束连接起来?或者它只是与 Python 的原生 .join() 方法共享一个名称?

最佳答案

join() 方法,当与 threadingmultiprocessing 一起使用时,与 str.join() - 它实际上并没有将任何东西连接在一起。相反,它只是意味着“等待这个[线程/进程]完成”。使用名称 join 是因为 multiprocessing 模块的 API 看起来类似于 threading 模块的 API,而 threading 模块使用 join 作为它的 Thread 对象。使用术语 join 来表示“等待线程完成”在许多编程语言中都很常见,因此 Python 也采用了它。

现在,无论是否调用 join(),您都会看到 20 秒延迟的原因是因为默认情况下,当主进程准备退出时,它会隐式调用 join() 在所有正在运行的 multiprocessing.Process 实例上。这在 multiprocessing 文档中没有明确说明,但在 Programming Guidelines 中有所提及。部分:

Remember also that non-daemonic processes will be automatically be joined.

您可以通过在启动进程之前将 Process 上的 daemon 标志设置为 True 来覆盖此行为:

p = Process(target=say_hello)
p.daemon = True
p.start()
# Both parent and child will exit here, since the main process has completed.

如果你这样做,子进程 will be terminated as soon as the main process completes :

daemon

The process’s daemon flag, a Boolean value. This must be set before start() is called.

The initial value is inherited from the creating process.

When a process exits, it attempts to terminate all of its daemonic child processes.

关于python - Python 多处理模块的 .join() 方法到底在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391025/

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