子流程已完成,但父流程已挂起

时间:2014-02-19 14:25:29

标签: python multiprocessing

我有一个应用程序启动子进程(目前为64)并完成一些工作。 每个进程在大约45分钟后完成,但不知何故父进程似乎挂起,因为父进程没有退出并挂起在join循环中。

我开始这样的过程:

def worker(out_q):
    # do something that takes a lot of time
    print('done working')
    sys.exit(0)

def main():
    procs = []
    out_q = Queue()

    for i in range(opt.num_threads):
        sys.stdout.write("\r\tStarting Worker Process: %d" %(i+1))
        sys.stdout.flush()
        p = multiprocessing.Process(target=worker, args=(out_q,))
        procs.append(p)
        p.start()

     #then i wait for all processes to finish:

    try:
        for i, p in enumerate(procs):
            print("waiting for process %d" %i)
            p.join()
            print("process %d joined" %i)
    except KeyboardInterrupt as e:
        sys.exit(0)
if __name__ == "__main__":
    main()

我看到的唯一输出是waiting for process 0,并且在完成所有进程后(我看到所有进程都说done working),进程列表中仍然有64个进程,而父进程没有完成。 似乎父进程挂起了,因为它无法被任务管理器杀死。

我如何调试或者我需要杀死进程?为什么在调用子进程中的sys.exit(0)之后,进程不会从进程列表中删除?

2 个答案:

答案 0 :(得分:1)

您不应在exit(0)函数中执行worker。这会在您有机会将成功报告回父级之前终止您的子流程。换句话说,在调用task_done()之前,子进程被终止,因此p.join()将永远等待。

答案 1 :(得分:0)

这可能不是挂断的直接原因。

您需要将args作为元组(out_q,)或列表[out_q]传递。

p = multiprocessing.Process(target=worker, args=(out_q,))
#                                                ^^^^^^^