我的问题与以下代码有关:
import multiprocessing
import math
import time
def do_work():
for i in range(1,10,1):
math.cos(i)
workers = [ multiprocessing.Process(target=do_work) for i in xrange(20) ]
for t in workers:
t.daemon = True
t.start()
time.sleep(100) # put here to simply indicate main is busy doing something
for t in workers:
print t.name + " joining"
t.join()
在加入子进程之前,您可以看到我的父进程已经睡了很长时间。我的孩子流程运行得很快。
问题是:
主进程在加入子进程之前等待很长时间是否可以,如上例所示?当主要过程加入时,是否存在儿童过程成为僵尸的危险?这段代码有问题吗?这是不好的代码吗?我该如何改进呢?
我的尝试:
我试图研究这种行为。对我来说似乎没问题。但是我猜想,一旦我确实看到一个子进程变成僵尸,至少ps
输出显示出来。
答案 0 :(得分:0)
如果某个进程的父级在没有确认其退出状态的情况下死亡,则该进程将变为僵尸。例如,如果您使用KILL信号强制终止脚本,则可能会发生这种情况。
如果您的父进程正忙着做其他事情,并且在孩子退出后立即无法立即致电join()
。
问题在于您在不加入旧流程的情况下继续创建流程。在这种情况下,您的操作系统很快就会耗尽资源。
在您的具体示例中,没有任何伤害,因为子进程被设置为守护进程,并且您在某个时刻加入它们。请记住,join()
会阻塞,直到给定的进程过期,因此您无需等待它就可以休眠。