【发布时间】:2014-02-19 14:25:28
【问题描述】:
我有一个启动子进程(当前为 64 个)并完成一些工作的应用程序。 每个进程在大约 45 分钟后完成,但不知何故父进程似乎挂了,因为父进程没有退出并挂在加入循环中。
我开始这样的过程:
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) 后进程没有从进程列表中删除?
【问题讨论】:
-
工人是否在
out_q中放了一些东西?你消耗队列吗? -
是的。我在这里看到了这个bugs.python.org/issue8237 我现在检查队列有多满并尝试实现队列刷新...