1

我的问题涉及到下面的代码:使用join()方法在python多处理

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输出显示。

+1

为什么主要过程在等待?你在主流程中做了一些实际的工作,还是真的在睡觉?如果是后者,'join()'方法会为你睡觉,并且可能对它更有效。 – Kevin

+0

调用't.join()'在主线程中已经完成''t'没有任何伤害。但是,一般原则是在启动子线程后加入,以便让主线程等待子线程完成其任务。 – ozgur

+0

@Kevin我添加了评论。只要考虑到在加入子进程之前main已经做了一些工作。 – abc

回答

0

如果一个进程死亡但没有确认其退出状态,进程就会变成僵尸。例如,如果您用KILL信号强制终止脚本,可能会发生这种情况。

如果您的父母程序忙于做其他事情,并且在孩子退出后立即无法拨打join()完全正常。

问题是当你不加入旧的过程而继续创建过程时。在这种情况下,您的操作系统很快就会耗尽资源。

在您的具体示例中,没有任何伤害,因为子进程被设置为守护进程,并且您在某个时间点加入它们。请记住,join()将阻止,直到给定的过程到期,所以你不需要睡觉等待它。

+0

您的意思是:“请记住,join()会阻止,直到给定的进程**到期**,所以您不需要睡觉就可以等待它。” – abc

+0

我在主线程(父进程)中的睡眠是简单地指示进程的一些繁忙工作,没有别的。 – abc

+0

是的,我的意思是,对于错误感到抱歉 – noxdafox