如何处理多进程.Pool中的初始化器错误?

How to handle initializer error in multiprocessing.Pool?(如何处理多进程.Pool中的初始化器错误?)
本文介绍了如何处理多进程.Pool中的初始化器错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当初始值设定项抛出如下错误时,脚本不会停止。
我想在启动主进程之前中止(不要运行‘do_omething’)。

from multiprocessing import Pool
import contextlib

def initializer():
    raise Exception("init failed")

def do_something(args):
    # main process
    pass

pool = Pool(1, initializer=initializer)
with contextlib.closing(pool):
    try:
        pool.map_async(do_something, [1]).get(100)
    except:
        pool.terminate()

控制台上的永不停止堆栈跟踪如下

...
Exception: init failed
Process ForkPoolWorker-18:
Traceback (most recent call last):
  File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/hoge/anaconda3/lib/python3.6/multiprocessing/pool.py", line 103, in worker
    initializer(*initargs)
  File "hoge.py", line 5, in initializer
    raise Exception("init failed")
Exception: init failed
...

我的解决方法是通过使用如下所示的全局标志在主进程开始时抑制初始值设定项错误和返回。
但我想学更好的。

def initializer():
    try:
        raise Exception("init failed")
    except:
        global failed
        failed = True

def do_something(args):
    global failed
    if failed:
        # skip when initializer failed
        return
    # main process

在使用推荐答案浏览了多处理的实现后,我确信没有更好的解决方案,因为如果存在任何工作进程--无论是意外的还是初始化失败的,池都会启动一个线程,通过_repanate_pool()来_Maintain_Pool()。

查看:Lib/multiprocessing/pool.py line 244

这篇关于如何处理多进程.Pool中的初始化器错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Initialising MSEdge Browser in python, getting TypeError: Level not an integer or a valid string: None(正在使用Python初始化MSEdge浏览器,获取TypeError:Level不是整数或有效字符串:无)
How do you initialize a global variable only when its not defined?(如何仅在全局变量未定义时才对其进行初始化?)
What is the suitable value to initialize an empty column of type geometry(初始化类型为GEOMETRY的空列的合适值是多少)
Initialize high dimensional sparse matrix(初始化高维稀疏矩阵)
Initializing task module global in dask worker using --preload?(正在使用--preload初始化DaskWorker中的全局任务模块?)
python mock default init argument of class(Python模拟类的默认初始化参数)