在python多处理中使用join()

时间:2015-09-24 01:40:35

标签: python python-2.7 process parallel-processing multiprocessing

我的问题与以下代码有关:

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 个答案:

答案 0 :(得分:0)

如果某个进程的父级在没有确认其退出状态的情况下死亡,则该进程将变为僵尸。例如,如果您使用KILL信号强制终止脚本,则可能会发生这种情况。

如果您的父进程正忙着做其他事情,并且在孩子退出后立即无法立即致电join()

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

在您的具体示例中,没有任何伤害,因为子进程被设置为守护进程,并且您在某个时刻加入它们。请记住,join()会阻塞,直到给定的进程过期,因此您无需等待它就可以休眠。