2015-10-23 66 views
2

我正在使用一个进程池。这种逻辑似乎一直工作到最近。为什么我不收割僵尸进程? (CentOS Linux,python)

pool = multiprocessing.Pool(processes = 2*multiprocessing.cpu_count()) 
for p in processArgs: 
    pool.apply_async(myFunc, p) 

pool.close() 
pool.join() 

现在看来,这是在运行时,我结束了在倒闭状态的所有子进程和父进程似乎没有对一个事实,即解散过程进行pool.join()但(基于a)仍然存在,并且b)关于接下来发生的逻辑看起来没有被执行的事实。

僵尸进程是僵尸,对不对?这意味着他们已经死亡,但还没有被收获,对吗?

+0

[ps -el'说他们是僵尸吗?](https://www.debian-administration.org/article/261/Finding_zombie_processes)你确定池已经完成所有项目的执行吗? –

+0

它确实表明它们是僵尸(Z存在)。 – vmayer

+0

在执行pool.close()或pool.join()之前,我需要确保退出吗?说实话,我从一个例子中复制了这个逻辑,并假设游戏池在完成关闭之前已经完成了所有项目。 – vmayer

回答

0

虽然我不完全理解它,但问题是我正在从我的一个子进程调用sys.exit()。这不是退出子进程的正确方法,应该调用os._exit()来代替:stackoverflow.com/questions/19747371

sys.exit()在退出之前先执行一堆清理操作:也许它被卡住试图执行一些清理,并且父进程正在等待加入它。

随意提供额外的解释,我可以编辑这个答案。