Python 子进程已完成,但父进程挂起
我有一个应用程序可以启动子进程(目前为64个)并执行一些工作。 每个进程大约45分钟后结束,但不知何故父进程似乎挂起了,因为父进程没有退出并挂起在联接循环中 我开始这样的过程:Python 子进程已完成,但父进程挂起,python,multiprocessing,Python,Multiprocessing,我有一个应用程序可以启动子进程(目前为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
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()
我看到的唯一输出是等待进程0
,在所有进程完成后(我看到所有进程都说完成工作
),进程列表中仍有所有64个进程,并且父进程未完成。
父进程似乎挂起了,因为任务管理器无法终止它
如何调试该进程或需要终止该进程?为什么在调用子进程内的sys.exit(0)后,该进程不会从进程列表中删除?这可能不是挂起的直接原因 您需要将参数作为tuple
(out\u q,)
或作为list[out\u q]
传递
p = multiprocessing.Process(target=worker, args=(out_q,))
# ^^^^^^^
您不应该在
worker
函数中执行退出(0)
。这会在子进程有机会向父进程报告成功之前终止子进程。换句话说,子进程在调用task\u done()
之前终止,因此p.join()
将永远等待。啊,不,这只是一个复制粘贴错误…工作程序有更多参数,我将它们分条。如果运行时间较短,整个过程都会工作。因此,此问题只会在长运行时发生>10min@reox,您是否使用来保护与多进程相关的代码,如果uuu name\uuuuuu='\uuuuu main\uuuuuu':..
?是的,我将附加在我发布的代码中找到。但是工作进程没有被杀死-我可以在procexplorer中看到进程映像。即使我没有执行sys.exit(0),父进程仍挂起在该循环中…我将在没有sys.exit(0)的情况下重试-可能需要一段时间while@reox:为什么不测试您的多处理代码,注释掉耗时的部分?因为这样一切都可以正常工作;)正如所说:只有让它运行一段时间,问题才会出现。我考虑了一个耗时部分的问题,但是当每个过程都结束并报告它已经完成时,我认为问题不在那里,所以我再次测试了它。每个进程都打印出它已经完成,但是循环总是等待第一个进程加入。工作人员是否在out\u q
?你在排队吗?是的,他们在排队。我在这里看到了这个,我现在检查队列有多满,并尝试实现队列刷新。。。