
信号量信号量又称, 类迭代锁并非同时只允许一个线程去更改数据这一情况出现, 而是同时放任一定数量的线程去更改数据, 举例而言, 像是一个地方存在3个座位这种情形, 那么最多仅仅允许3个人坐在上面, 后续到来的人唯有等待有人起身离开了, 才能够再次有人坐下。def run(n,semaphore): semaphore.acquire() #加锁 time.sleep(3) print(run the thread:%s\n % n) semaphore.release() #释放 if __name__ __main__: num0 semaphore threading.Semaphore(5) #最多允许5个线程同时运行 for i in range(10): t threading.Thread(targetrun,args(t-%s % i,semaphore)) t.start() while threading.active_count() !1: pass else: print(all threads done)条件变量有这么一种被称作条件变量的东西, 它除了能给出跟Lock相类似的某些方法外, 还具备wait以及其他方法。线程先是拥有一个条件变量, 接着去判别一些条件。要是条件未得以满足的情况 , 那么该线程就会执行wait操作 要是条件达成 状况, 在经过一些处理从而改变条件之后 , 会借助某个方法去告知别的线程 , 那些正处于wait状态的其他线程 在接到这个通知后会再次去判断条件。就这么持续不断地重现这一流程步骤 , 用于进而解决繁杂棘手的同步问题。def A(cond): with cond: print(1) cond.notify() cond.wait() print(3) cond.notify() cond.wait() def B(cond): with cond: cond.wait() print(2) cond.notify() cond.wait() print(4) if __name__ __main__: cond threading.Condition() t1 threading.Thread(targetA, args(cond,)) t2 threading.Thread(targetB, args(cond,)) t2.start() t1.start() t1.join() t2.join()事件要是程序里的其他线程需要凭借判定某个线程的状态拿定自己后续的动作时, 此时线程一起出现的状况处理事宜便会显得特别困难。若想矫治此类难题进而需要运用资源里的Event范畴。范畴具备一个能够经由某个线程确立的信号标记物品, 物件可以被许可来让给定某个线程待命直到一些事件产生效应了。源于方才开始启动之初, Event范围内标记物品被划定为假。要是有某个线程滞留在某个Event范畴, 此外这个Event标记物品却是假的,那么该线程会始终受阻在那状况直至这个标记变成真时候。倘若有一线程, 把一个Event对象的信号标志设定成真, 那它会唤醒所有在等待此Event对象的线程。要是有一个线程, 在等待一个已然被设置为真的Event对象, 那么它会对这个事件予以忽略, 而后继续施行。from threading import Thread,Event import time eventEvent() def light(): print(红灯正亮着) time.sleep(3) event.set() #绿灯亮 def car(name): print(车%s正在等绿灯 %name) event.wait() #等灯绿 此时event为False,直到event.set()将其值设置为True,才会继续运行. print(车%s通行 %name) if __name__ __main__: # 红绿灯 t1Thread(targetlight) t1.start() # 车 for i in range(10): tThread(targetcar,args(i,)) t.start()实例在第一个线程里头, 去获取当下的时间, 接着判断当下时间往后3秒的时候, 进而触发“事件”对象。于另一个线程当中, 当作数学考试结束的得以判断的变量, 不然的话就始终处于考试状态里, 并且还要进行打印。import threading#导入线程类 import time#导入python中的time类 class Eventthread(threading.Thread):#定义事件监听类继承于Thread类 def __init__(self):#定义构造方法 super(Eventthread, self).__init__()#重写Thread类的构造方法初始化self属性 def run(self):#重写Thread类的run方法执行实际逻辑结构 for i in range(3): #for语句循环3秒 print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())) #以%Y-%m-%d %H:%M:%S的格式输出显示当前的时间 time.sleep(1) #使线程挂起1秒减少输出次数 event.set()# 设置事件响应 class Mythread(threading.Thread):#自定义线程类继承于Thread类 def __init__(self):#定义构造方法 super(Mythread, self).__init__()#重写Thread类的构造方法初始化self属性 def run(self):#重写Thread类的run方法执行实际逻辑结构 while(True): #循环判断事件是否响应 print(考试中) #若事件未响应则输出“考试中”的信息 time.sleep(1) #使线程挂起1秒减少输出次数 if event.is_set(): #若事件响应 print(考试结束) #则输出“考试结束”的信息 break #并跳出循环 if __name____main__: #创建主线程 event threading.Event() #初始化event对象 mt Mythread() #初始化一个线程对象 et Eventthread() #初始化一个线程对象 mt.start() #启动线程 et.start() #启动线程