我有一个应用程序启动子进程(目前为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)之后,进程不会从进程列表中删除?
答案 0 :(得分:1)
您不应在exit(0)
函数中执行worker
。这会在您有机会将成功报告回父级之前终止您的子流程。换句话说,在调用task_done()
之前,子进程被终止,因此p.join()
将永远等待。
答案 1 :(得分:0)
这可能不是挂断的直接原因。
您需要将args作为元组(out_q,)
或列表[out_q]
传递。
p = multiprocessing.Process(target=worker, args=(out_q,))
# ^^^^^^^