同步条件(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 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)是一种用于多线程同步的机制,它可以用来控制对共享资源的访问。信号量是一个非负整数值,通常用于表示可用资源的数量。
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()
版权归原作者 一壶浊酒.. 所有, 如有侵权,请联系我们删除。