同步条件(Event)
在Python中,多线程同步可以通过threading
模块中的Event
对象来实现。Event
对象允许一个或多个线程等待某个事件的发生,当事件发生时,等待的线程将被唤醒。
event.isSet():返回event的状态值
event.wait():如果 event.isSet()==False,将阻塞线程触发event.wait()
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待执行
event.clear():恢复event的状态值为False
import threading
import timeclass Techer(threading.Thread):def run(self):print('开始考试')event.set() #设置为真print('techer event',event.isSet())time.sleep(1)print('考试结束')event.set()class Student(threading.Thread):def run(self):event.wait() #此时阻塞,等待event设置为真print('考试中')time.sleep(1)event.clear() #event恢复初始状态print('student event',event.isSet())event.wait() #等待考试结束的指令print('终于考完了')if __name__=='__main__':event=threading.Event() #定义一个Event对象 初始event对象 的状态为False 当Event.wait()则会阻塞等待Event.isSet()对象为Trueprint('主线程 event',event.isSet())threads=[]for i in range(1):threads.append(Student()) #定义Student线程threads.append(Techer())for t in threads:t.start()for t in threads:t.join() #阻塞print('主线程结束')
信号量(Semaphore)
信号量(Semaphore)是一种用于多线程同步的机制,它可以用来控制对共享资源的访问。信号量是一个非负整数值,通常用于表示可用资源的数量。
Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。
import threading
import timesemaphore = threading.Semaphore(5)def func():if semaphore.acquire():print (threading.currentThread().getName() + '获取共享资源')time.sleep(2)semaphore.release()for i in range(10):t1 = threading.Thread(target=func)t1.start()