目录
信号量
什么是信号量:类似于一个计数器,当资源释放时计数器就会递增,当资源申请时计数器就会递减。可以认为信号量就代表着资源是否可用。
怎样实现信号量:threading模块里的Semaphore类,实现了信号量对象,可用于控制获取资源的线程数量。所具有的acquire()和release()方法,可以用with语句的上下文管理器。当进入时,将调用acquire()方法,当退出时,将调用release()。
实例:
import threading
def run(n):
semaphore.acquire()
print(n)
time.sleep(2)
semaphore.release()
条件变量
什么是条件变量:Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。
怎么实现:线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。
实例:
import time
import threading
def run(x):
con.acquire()
print(f'xiancheng{x}')
con.notify()
print(f'xiancheng{x}guaqi')
con.wait()
time.sleep(2)
print(f'xiancheng{x}zaiciqidong')
con.nitify()
con.release()
事件
为什么需要事件:如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。
理解事件的工作机制:在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。
怎样实现:
event.isSet():返回event的状态值;
event.wait():如果 event.isSet()==False将阻塞线程;
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
event.clear():恢复event的状态值为False。
实例:
import time
import threading
def car()
While True:
if event.is_set()
print('')
else:
print('')
event.wait()
def set_event():
While True:
event.set()
time.sleep(2)
event.clear()
time.sleep(2)