在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 time class 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()对象为True print('主线程 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管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。
import threading import time semaphore = 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()