信号量
信号量用来控制线程并发数的,Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。其实就是控制最多几个线程可以操作同享资源。
import threading, time class my_thread(threading.Thread): def run(self): if semaphore.acquire(): # 加锁 print(self.name) time.sleep(1) semaphore.release() # 解锁 if __name__ == "__main__": semaphore - threading.Semaphore(5) # 创建锁对象,二者都可以 thrs = [] for i in range(100): thrs.append(my_thread()) for t in thrs: t.start()
上面一个简单的例子就是创建100个线程,让每次只让5个线程去执行run函数。
用一个图形象的解释就是
条件变量
条件变量的同步
有一类线程需要满足条件之后才能够执行,Python提供了threading.Condition 对象用于条件变量线程的支持,它除了能提供RLock()或Lock() 方法外,还提供了wait()、notify()、notifyAll()方法。
wait():条件不满足时调用,线程会释放锁并进入等待阻塞。
notify():条件创建后调用,通知等待池激活另一个线程。
notifyAll():条件创造后调用,通知等待池激活所有线程。
事件
同进程一样
线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。
- event.isSet():返回event的状态值
- event.wait():如果event的状态值为False将阻塞线程
- event.set():设置event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统的调度。
- event.clear():恢复event的状态值为False。
import threading import time def car(): while True: if event.is_set(): print("小车启动") else: print("小车停止") event.wait() def set_event(): while True: event.set() time.sleep(1) event.clear() ime.sleep(1) if __name__ == "__main__": event = threading.Event() car1 = threading.Thread(target=car) car1.start() set_ = threading.Thread(target=set_event) set_.start()