当子进程被杀死时,Python的池映射会挂起

时间:2016-02-29 16:55:06

标签: python

我现在敲打了一天以上的时间,试图理解为什么我的程序的孩子不能提出任何异常而只是死亡,而不是整个{{1} }挂起。让我补充一点,我在互联网上搜索了几个小时,没找到相关的东西。

我们以此为例:

Pool

使用#!/opt/perforce/bin/python/3.4.2/bin/python3 import multiprocessing import sys def run(i): print(i) sys.exit(1) iteration = ['test1', 'test2', 'test3'] with multiprocessing.Pool(1) as pool: pool.map(run, iteration) print("reached here ?") ,从未到达打印件,sys.exit()由于某些原因挂起了块。在我的真实脚本中,当我发现某种错误时添加了pool.map。我希望能够优雅地杀死一个工人(或者只是让它跳过迭代,就像休息一样)。我尝试了sys.exit()sys.exit()甚至exit(),但没有运气......

有可能吗?

1 个答案:

答案 0 :(得分:0)

我建议你提出一个异常并将其捕获到可调用范围之外。像这样:

import multiprocessing
import sys


def run(i):
    print(i)
    if i == 'test3':
        raise Exception()

iteration = ['test1', 'test2', 'test3']

with multiprocessing.Pool(1) as pool:
    try:
        result = pool.map(run, iteration)
    except Exception:
        sys.exit(1)
    print("reached here ?")