编写某脚本时需要获取线程中报错信息来做出判断,而线程是不带返回值的。因为线程有独立的栈,线程产生的异常发生在不同的栈上,因此利用try..except无法捕捉到线程的报错,也无法获取线程调用的函数的返回值。
网上有利用类的变量来传递线程内的消息,也有使用 Queue 库创建队列实例来传递数据的。但总觉得有些“臃肿”,不太满意。思考着突然豁然开朗,可以在线程运行的函数内部判断端口的连接情况,然后用threading.Event()的标志设置与否,来传递结果,让主函数知道接下来该如何运行。设置了标志说明要进行下一步操作,未设置标志则return退出当前操作。
就是将原本要传的值,在函数内就做了处理判断,threading.Event()只能向外传递True or False。
关于threading.Event()的基础知识可参考:https://blog.csdn.net/u012067766/article/details/79734630
示例:
# -*- coding: utf8 -*-
import threading
def mm(i,event1):
try:
i2=i+"str" #程序会在这里报错
except:
if i==9:
event1.set()
for i in range(0,10):
event1 = threading.Event()
t1 = threading.Thread(target=mm, args=(i,event1))
t1.start()
if not event1.isSet():
print str(i)+": False"
if event1.isSet():
print str(i)+": True"
运行结果:
0: False
1: False
2: False
3: False
4: False
5: False
6: False
7: False
8: False
9: False
9: True