############### 信号量和事件 ##############
# 信号量 # 信号量就是控制只能有n个线程能访问这段代码 # from threading import Semaphore,Thread # import time # def func(sem,a,b): # sem.acquire() # time.sleep(1) # print(a+b) # sem.release() # # sem = Semaphore(4) # for i in range(10): # t = Thread(target=func,args=(sem,i,i+5)) # t.start() # 事件: # 事件被创建的时候是false状态,这个false状态会导致wait被阻塞, # true状态的时候,wait就不阻塞了 # clear,设置为false # set,设置状态未false, # 上次举例的是红绿灯的例子, # 现在我们举一个例子,检测数据库的可连接情况 # 启动两个线程, # 第一个线程连接数据库, # 等待一个信号,告诉我们之间的网络是通的 # 第二个线程,检测和数据自己之间的网络是否是通的 # 通了之后把事件的状态改为true, import time,random from threading import Thread,Event def connect_db(e): count = 0 while count < 3: # e.wait() # 这个是一直等待,这种比较浪费资源, e.wait(0.1) # 这是我只等待1秒,否则我就不等你了,# 但是我应该有一个重连的过程,比如三次,三次都连接不上,就断掉了 if e.is_set() == True: print("连接数据库") break else: print("连接失败") count += 1 else: raise TimeoutError("数据库连接超时") # 主动报异常 def check_web(e): time.sleep(random.randint(0,2)) e.set() e = Event() t1 = Thread(target=connect_db,args=(e,)) t2 = Thread(target=check_web,args=(e,)) t1.start() t2.start()
############### 线程的条件和定时器 ##############
# 条件 from threading import Condition,Thread,Timer # 可以把条件视为一个更加复杂的锁 # 同时也有两个方法,acquire,release # 一个条件被创建,默认也是一个false状态,会影响wait处于等待状态 # notify(int),这是制造钥匙,参数是制造多少把钥匙 # 这个几乎就是只会出现在面试里面,平时基本不会用到, # # def func(con,i): # con.acquire() # con.wait() # 在等待钥匙, # print("在第%s个循环里"%i) # con.release() # # # con = Condition() # for i in range(10): # Thread(target=func,args=(con,i)).start() # # # while True: # num = int(input(">>>")) # con.acquire() # con.notify(num) # 制造钥匙, # con.release() # 定时器: def func(): print("时间同步") Timer(2,func).start() # 等待两秒钟开启一个线程,