50_并发编程-线程-事件
一、定义
如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。
事件的方法:
事件方法
1 event = Event() # 默认状态为False 2 event.isSet() # 返回event的状态值 3 event.wait() # 如果event.isSet()==False将阻塞线程 4 event.set() # 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统调度 5 event.clear() # 回复event的状态为False
二、实例
首先起两个线程:
第一个线程的用处:连接数据库,那么我这个线程需要等待一个信号,告诉我我们之间的网络是可以连通的。
第二个线程的用处:检测与数据库之间的网络是否联通,并发送一个可联通或者不可联通的信号。
View Code
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 t1 = random.randint(0,3) 18 print('>>>>',t1) 19 time.sleep(t1) 20 event.set() 21 if __name__ == '__main__': 22 event=Event() 23 check = Thread(target=check_mysql) 24 conn1=Thread(target=conn_mysql) 25 conn2=Thread(target=conn_mysql) 26 27 check.start() 28 conn1.start() 29 conn2.start()