目录
信号量
信号量是由操作系统管理的一种抽象数据类型,用于在中多线程同步对共享资源的使用。本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取。也可以简单的理解为,信号量是多把锁,同时允许多个线程来更改数据。
用于控制线程并发数
import threading
class Mythread(threading.Thread):
def run(self):
if seamphore.acquire():#加锁
print(self.name)
time.sleep(1)
seamphore.realease()#释放
if __name__ == "__main__":
semaphore = threading.Semaphore(5)#创建锁对象
thrs=[]
for i in range(100):
thrs.append(Mythread())
for j in thrs:
j=start()
条件变量
Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。
可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。
使用条件变量
(1)创建Condition对象,使用acquire调用Condition对象
(2)调用wait方法时,释放Condition,进入等待状态,同时在waiting池中记录这个线程。
(3)调用notify方法时,Condition对象调用acquire方法尝试取到锁。
事件
创建事件
import threading
import time
def car():
while True:
if event.is_set():#如果事件已创建
print('小车行驶')
else:
print('小车停止')
event.wait(1)
def set_event():#创建事件
while True:
event.set()
time.sleep(1)
event.clear()
time.sleep(3)
if __name__ == '__main__':
event = threading.Event()
car1 = threading.Thread(target=car)
car1.start()
set_e = threading.Thread(target=set_event())
set_e.start()