栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

未检测到在多处理池中引发的异常

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

未检测到在多处理池中引发的异常

我有一个合理的解决方案,至少用于调试目的。我目前没有一个可以在主要流程中引发异常的解决方案。我的第一个想法是使用装饰器,但是您只能腌制在模块顶层定义的函数,所以没错。

取而代之的是一个简单的包装类和一个Pool子类,将其用于

apply_async
(因此
apply
)。我将
map_async
作为练习留给读者。

import tracebackfrom multiprocessing.pool import Poolimport multiprocessing# Shortcut to multiprocessing's loggerdef error(msg, *args):    return multiprocessing.get_logger().error(msg, *args)class LogExceptions(object):    def __init__(self, callable):        self.__callable = callable    def __call__(self, *args, **kwargs):        try: result = self.__callable(*args, **kwargs)        except Exception as e: # Here we add some debugging help. If multiprocessing's # debugging is on, it will arrange to log the traceback error(traceback.format_exc()) # Re-raise the original exception so the Pool worker can # clean up raise        # It was fine, give a normal answer        return resultclass LoggingPool(Pool):    def apply_async(self, func, args=(), kwds={}, callback=None):        return Pool.apply_async(self, LogExceptions(func), args, kwds, callback)def go():    print(1)    raise Exception()    print(2)multiprocessing.log_to_stderr()p = LoggingPool(processes=1)p.apply_async(go)p.close()p.join()

这给了我:

1[ERROR/PoolWorker-1] Traceback (most recent call last):  File "mpdebug.py", line 24, in __call__    result = self.__callable(*args, **kwargs)  File "mpdebug.py", line 44, in go    raise Exception()Exception


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号