#1、Event里面有一个标志flag,当e = Event()刚创建的时候,flag=False,阻塞,这个时候,e.is_set()也是等于False,阻塞。 #e.set()让flag变成非阻塞,e.clear()让flag变成阻塞。 #e.wait() 当flag=True,非阻塞;当flag=False,阻塞。 #2、例子:模拟连接mysql数据库,设置连接三次,每0.5秒连接一次,如果连接成功,打印出成功,否则就报错。 from threading import Thread from threading import Event import time import random def conn(e): count = 1 while not e.is_set(): #e.is_set()刚创建的时候是False,所以这里是while True的意思。 if count > 3: raise TimeoutError #连接大于3次,抛出超时错误。 print('连接第%s次'%count) count += 1 e.wait(0.5) #每次连接都是等待0.5秒。那么2次连接就是1秒,因为下面的e.set()是1秒之后执行,那么 print('连接成功')#当下面检测1秒并且conn比check先执行的情况下,可以连接三次才打印成功;如果 # 同时执行,只连接两次就打印成功。当下面检测2秒,就会抛出错误。 def check(e): time.sleep(random.randint(1,2)) #模拟检测数据库连接是否正常(省略了n行代码),检测使用了1或2秒 e.set() #1秒以后,变成非阻塞。 e = Event() t = Thread(target=conn,args=(e,)) t.start() t1 = Thread(target=check,args=(e,)) t1.start() #有三种结果: # 连接第1次 # 连接第2次 # 连接成功 # 连接第1次 # 连接第2次 # 连接第3次 # TimeoutError # 连接第1次 # 连接第2次 # 连接第3次 # 连接成功