multiprocessing Pool的异常处理问题

本文分析了在使用Python multiprocessing.Pool时遇到的AttributeError问题,源于子进程未捕获异常导致Pool崩溃。通过研究Pool的实现,发现异常在worker中未正确处理,且_handle_results线程只处理特定异常,其他异常可能导致主进程阻塞。解决方案是在func中捕获所有异常,确保不将异常抛到Pool中。此外,还探讨了pickle序列化在异常传递中的作用及MySQL Error类中args属性与__init__()参数顺序不一致的问题。
摘要由CSDN通过智能技术生成

multiprocessing.Pool开发多进程程序时,在某个子进程执行函数使用了mysql-python连接数据库,
由于程序设计问题,没有捕获到所有异常,导致某个异常错误直接抛到Pool中,导致整个Pool挂了,其异常错误如下所示:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 812, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 765, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 376, in _handle_results
    task = get()
  File "/usr/lib/python2.7/site-packages/mysql/connector/errors.py", line 194, in __init__
    'msg': self.msg.encode('utf8') if PY2 else self.msg
AttributeError: ("'int' object has no attribute 'encode'", <class 'mysql.connector.errors.Error'>, 
(2055, "2055: Lost Connection to MySQL '192.169.36.189:3306', system error: timed out", None))

本文档基于以上问题对multiprocessing.Pool以及python-mysql-connector的源码实现进行分析,以定位具体的错误原因。解决方法其实很简单,不要让异常抛到Pool里就行。

问题产生场景

python 版本centos7.3自带的2.7.5版本,或者最新的python-2.7.14
mysql-connector库,版本是2.0及以上,可到官网下载最新版:mysql-connector

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值