<一>Event事件
线程Event基本和进程的Event语法是一样的
# wait() 动态给程序加阻塞
# set() 将内部属性改成True
# clear() 将内部属性改成False
# is_set() 判断当前属性(默认是False)
e = Event()
print(e.is_set())
# timeout = 5 最多等待5秒
e.wait(timeout = 5) # 简写 e.wait(5) 进程里面亦可以这样写
print(e.is_set())
例:模拟连接数据库,超时主动抛异常
from threading import Event, Thread import time, random def check(e): print("开始检测数据库连接") time.sleep(random.randrange(1, 6)) e.set() def connect(e): sign = False for i in range(3): e.wait(1) if e.is_set(): sign = True print("数据库连接成功") break else: print("尝试连接数据库%s次失败" % (i + 1)) if sign == False: # 主动抛出异常 raise TimeoutError e = Event() Thread(target=connect, args=(e,)).start() Thread(target=check, args=(e,)).start()
执行结果:
开始检测数据库连接
尝试连接数据库1次失败
尝试连接数据库2次失败
数据库连接成功
<二> 守护线程
语法: 和守护进程不一样,作用也不一样,守护进程实际守护的是主进程
对象.setDaemon(True)
例:和守护进程不一样,守护线程实际守护的是其他子进程,伴随其他子线程的结束而结束
from threading import Thread import time def func1(): while True: time.sleep(0.5) print(111) def func2(): print("func2 start->") time.sleep(2) print("func2 end->") t1 = Thread(target=func1) t2 = Thread(target=func2) # setDaemon 将普通线程变成守护线程 t1.setDaemon(True) t1.start() t2.start() print("主线程代码结束")
执行结果:
func2 start-> 主线程代码结束 111 111 111 111 func2 end->