【发布时间】:2014-10-13 00:03:55
【问题描述】:
了解 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()
我添加了PID 和time.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() 方法共享一个名称?
【问题讨论】:
-
据我所知,它持有主线程并等待子进程完成然后重新加入主线程中的资源,主要是干净退出。
-
嗯,有道理。所以实际的
CPU, Memory resources正在与父进程分离,然后join在子进程完成后再次返回? -
是的,它就是这么做的。所以,如果你不加入他们,当子进程完成时,它只是作为一个不存在或死的进程而存在
-
@abhishekgarg 这不是真的。当主进程完成时,子进程将被隐式加入。
-
@dano,我也在学习 python,我只是分享了我在测试中发现的内容,在我的测试中,我有一个永无止境的主进程,所以也许这就是为什么我认为这些子进程已经失效。