Python的学习之旅———线程 事件
事件
同进程的一样
线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行
1 from threading import Thread,Event 2 import threading 3 import time,random 4 def conn_mysql(): 5 count=1 6 while not event.is_set(): 7 if count > 3: 8 raise TimeoutError('链接超时') 9 print('<%s>第%s次尝试链接' % (threading.current_thread().getName(), count)) 10 event.wait(0.5) 11 count+=1 12 print('<%s>链接成功' %threading.current_thread().getName()) 13 14 15 def check_mysql(): 16 print('\033[45m[%s]正在检查mysql\033[0m' % threading.current_thread().getName()) 17 time.sleep(random.randint(2,4)) 18 event.set() 19 if __name__ == '__main__': 20 event=Event() 21 conn1=Thread(target=conn_mysql) 22 conn2=Thread(target=conn_mysql) 23 check=Thread(target=check_mysql) 24 25 conn1.start() 26 conn2.start() 27 check.start()
event.is_set() 默认是 False 在event.set()执行完毕之后,变为True
event.wait(0.5) 中止程序进行,直到 event.set() 执行 ,event.wait(0.5)就变为非阻塞态 ,活着 0.5超时。
event.set() 设置event的状态为True 所有阻塞池的线程激活进入就绪状态。
event.clear 恢复even 的状态为False