Python 2.7.3多处理池挂起

Python 2.7.3多处理池挂起,python,multiprocessing,Python,Multiprocessing,我在ipython中有以下代码,其中子进程尝试执行sys.exit(…),但导致父进程挂起。这是虫子吗?知道如何解决这个问题吗 In [1]: from multiprocessing import Pool In [2]: def f(): ...: import sys ...: sys.exit('exiting system...') ...: In [3]: p = Pool(processes=2) In [4]: r = p.appl

我在ipython中有以下代码,其中子进程尝试执行
sys.exit(…)
,但导致父进程挂起。这是虫子吗?知道如何解决这个问题吗

In [1]: from multiprocessing import Pool

In [2]: def f():
   ...:     import sys
   ...:     sys.exit('exiting system...')
   ...:    

In [3]: p = Pool(processes=2)

In [4]: r = p.apply_async(f, [])

In [5]: r.get()   <---- it is hanging here forever.
[1]中的
:来自多处理导入池
在[2]:def()中:
…:导入系统
…:sys.exit('正在退出系统…')
...:    
在[3]中:p=Pool(进程=2)
在[4]中:r=p.apply\u async(f,[]

在[5]:r.get()中,当调用
sys.exit()
时,您正在导致
工作进程实际退出。
SystemExit
异常是特殊情况;当您提升它时,您在中提升它的进程将退出。异常不会传播到调用方。因此,这意味着在您的示例中,工作进程永远不会将任何内容返回给父进程。然后父进程将永远等待子进程返回永远不会返回的东西。有关该行为的更深入讨论,请参阅

我认为这是一个bug,当子进程退出时,
应该标记为已断开,所有未完成的任务都应该中止。这就是我们现在的表现。实际上,我已经将此行为添加到了
多处理.Pool
,但到目前为止还没有对其进行审查


现在,回到你原来的问题。看起来您希望父进程在此退出,而不仅仅是子进程。要做到这一点,您需要将一些对象返回给父对象,然后在父对象接收到该对象时让其退出。看起来您已经发现,只需引发一个
异常

就可以做到这一点,但不支持您在回调函数中退出。它必须立即返回。“回调应立即完成,否则处理结果的线程将被阻止。”()您能否解释为什么在这种情况下,
raiseexception
起作用,而不是
raisesystemexit
?这可能是由sys的本地导入或处理ppol类的特殊错误引起的。但这不是主要问题。为什么要退出子线程?您应该在主线程中退出。如果要退出子线程,只需使用return。OP在这里根本没有使用
回调
关键字arg,因此我认为文档中的引用与本例无关。