boh*_*anl 5 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.apply_async(f, [])
In [5]: r.get() <---- it is hanging here forever.
Run Code Online (Sandbox Code Playgroud)
我也尝试过代替,raise SystemExit(...)但sys.exit(...)结果是一样的。我知道的唯一解决方法是把raise Exception(...)结果放在一起,效果很好。
我知道这sys.exit本质上与 相同raise SystemExit,但是这个异常应该委托给它的父进程,因此r.get()应该能够正确地接收这个异常?但它似乎陷入了recv待命状态。multiprocessing这是模块中的错误吗?
当您调用 时,您会导致Pool工作进程实际退出sys.exit()。例外SystemExit是特殊情况;当你提出它时,你提出它的进程就会退出。异常不会传播给调用者。因此,这意味着在您的示例中,工作进程根本不会将任何内容返回给父进程。然后父进程将永远等待子进程返回永远不会返回的东西。请参阅此问题以更深入地讨论该行为。
我认为这是一个错误,当子进程退出时,pool应将其标记为已损坏,并且应中止所有未完成的任务。这就是concurrent.futures.ProcessPoolExecutor行为方式。我实际上已经提交了一个补丁,将这种行为添加到 中multiprocessing.Pool,但到目前为止还没有经过审查。
现在,回到你原来的问题。看起来您希望父进程在这里退出,而不仅仅是子进程。为此,您需要实际将某个对象返回给父级,然后在接收到该对象时让父级退出。看起来您已经发现只需简单地提高Exception.
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |