<一>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->