python主线程捕获子线程的方法


Posted in Python onJune 17, 2018

最近,在做一个项目时遇到的了一个问题,主线程无法捕获子线程中抛出的异常。

先看一个线程类的定义

''''' 
Created on Oct 27, 2015 
 
@author: wujz 
''' 
import threading 
 
class runScriptThread(threading.Thread): 
 def __init__(self, funcName, *args): 
  threading.Thread.__init__(self) 
  self.args = args 
  self.funcName = funcName 
  
 def run(self): 
  try: 
   self.funcName(*(self.args)) 
  except Exception as e: 
   raise e

很简单,传入要调用的方法,并启用一个新的线程来运行这个方法。

在主线程中,启动这个线程类的一个对象时,这要声明一个对象然后启动就可以了,示例如下

import runScriptThread,traceback 
 
if __name__=='__main__': 
 sth = 'hello world' 
 try: 
  aChildThread = runScriptThread(printSth, sth) 
  aChildThread.start() 
  aChildThread.join() 
 except Exception as e: 
  print(str(traceback.format_exc()))

但是这样的代码,main方法中无法捕获子线程中的异常,原因在于start()方法将为子线程开辟一条新的栈,main方法的栈因此无法捕获到这一异常。

解决方法很简单,就是通过设置一个线程是否异常退出的flag的成员变量,当线程异常退出时,对其作一标记。然后在主线程中检查改线程运行结束后该标志位的值,如果异常,再通过sys和traceback回溯异常信息,然后抛出即可。改写后的异常类:

''''' 
Created on Oct 27, 2015 
 
@author: wujz 
''' 
import threading,traceback,sys 
 
class runScriptThread(threading.Thread): #The timer class is derived from the class threading.Thread 
 def __init__(self, funcName, *args): 
  threading.Thread.__init__(self) 
  self.args = args 
  self.funcName = funcName 
  self.exitcode = 0 
  self.exception = None 
  self.exc_traceback = '' 
  
 def run(self): #Overwrite run() method, put what you want the thread do here 
  try: 
   self._run() 
  except Exception as e: 
   self.exitcode = 1  # 如果线程异常退出,将该标志位设置为1,正常退出为0 
   self.exception = e 
   self.exc_traceback = ''.join(traceback.format_exception(*sys.exc_info())) #在改成员变量中记录异常信息 
  
 def _run(self): 
  try: 
   self.funcName(*(self.args)) 
  except Exception as e: 
   raise e

改写后的主线程:

import runScriptThread,traceback 
 
if __name__=='__main__': 
 sth = 'hello world' 
 try: 
  aChildThread = runScriptThread(printSth, sth) 
  aChildThread.start() 
  aChildThread.join() 
 except Exception as e: 
  print(aChildThread.exc_traceback)

以上全部为本篇文章的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中http请求方法库汇总
Jan 06 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
python字典操作实例详解
Nov 16 Python
python放大图片和画方格实现算法
Mar 30 Python
Tensorflow之Saver的用法详解
Apr 23 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
Apr 27 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
详解python深浅拷贝区别
Jun 24 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 #Python
Python实现自定义函数的5种常见形式分析
Jun 16 #Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 #Python
Python实现简单的文本相似度分析操作详解
Jun 16 #Python
Django跨域请求问题的解决方法示例
Jun 16 #Python
Python for循环生成列表的实例
Jun 15 #Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 #Python
You might like
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
json定义及jquery操作json的方法
2016/09/29 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
python实现sublime3的less编译插件示例
2014/04/27 Python
决策树的python实现方法
2014/11/18 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
如何在python中执行另一个py文件
2020/04/30 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
Python如何将装饰器定义为类
2020/07/30 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
教师应聘个人求职信
2013/12/10 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
成绩单评语
2015/01/04 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
环保主题班会教案
2015/08/13 职场文书
师德培训心得体会2016
2016/01/09 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
Elasticsearch 基本查询和组合查询
2022/04/19 Python
使用Apache Camel表达REST服务的方法
2022/06/10 Servers