最近用到了python多线程,线程库threading.Thread这个类不支持获取函数返回值,需要重写,参考了网上几篇代码,大多都是直接给了代码没有注释,自定义修改上手不容易,这里分享一下我自己的代码
class BugThread(threading.Thread):
def __init__(self, target=None, name=None, args=()):
super(BugThread, self).__init__() # 父类的初始化方法来初始化继承的属性
# 自定义初始化参数
self._target = target
self._args = args
self.setName(str(name))
self._result = -1 # 自定义默认返回类型,防止未join()错误
# 重定义run函数
def run(self):
try:
if self._target:
self._result = self._target(*self._args)#子线程执行的函数
finally:
del self._target, self._args #如果是单击按钮操作执行子线程,就注释这句代码,不然你的按钮就只能点击一次
# 新添线程返回值获取
def bug_result(self):
return self._result
重写类需要注意3点:
- 初始化函数参数的定义:初始化函数只定义自己要用的参数,然后调用父类的初始化来初始化本类,再单独初始化自己需要的参数,可以自定义新的变量接收参数值然后到run函数里面去使用,或者将自定义的参数值赋值给类自带的变量。
- run函数的使用:run函数推荐去参考源码的使用方式,自定义一般不用 self._kwargs这个变量,那么del操作就不要包括它,这部分一定要用try形式执行,不然就等着各种崩溃吧:)
- 自定义函数和参数名称冲突问题:在自定义新的变量名和函数名时,注意不要和类原有的函数重名(重写函数),自定义变量要在类初始化函数__init__里面,不然没有权限访问
- 关于run函数的finally,如果是类似单击按钮执行子线程,就执行用pass语句填充,不要del属性,如果del属性,第二次点击按钮就不能正常执行子线程了
最后,pycharm查看类或函数源码的快捷键“ctrl+B”