信号量Semaphore
本质是锁,用来控制线程并发数,BoundedSemaphore或Semaphore管理一个内置的计数器,每当调用acquire()时-1,调用release()时+1.
计数器不能小于0,当计数器小于0时,acquire()将阻塞线程到同步锁状态,直到其他线程用release()
BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时会检查计数器的值是否超过了计数器的初始值,如果超过了,就抛出一异常。
信号量与递归锁RLock在涉及到的多把锁问题上,不同之处在于递归锁是嵌套锁,而信号量是并行的锁,当然由于python的GIL存在,这里的并行锁其实是伪并行
#简单的用法示例
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)#创建锁对象,二者都可以
#semaphore = threading.BoundedSemaphore(5)
thrs = []
for i in range(100):
thrs.append(my_thread())
for t in thrs:
t.start()
条件变量同步
本质是锁,可以实现线程间的通信。
在运用多线程时,很多时候我们都会想让不同线程间能够进行一个先后的顺序,类似于线程1创造好条件后,通知线程2不再阻塞,可以继续运行了,为了实现这一目的,python为我们提供了threading.Condition对象用于条件变量线程的支持,配套的提供了wait(),notify(),notifyall()方法。
lock_con = threading.Condition([Lock/RLock])
#锁是可选选项,如果创建对象的时候,没有传入锁,那么默认是RLock锁
- wait():条件不满足时调用,线程会释放锁,并进入等待阻塞状态
- notify():条件创造后调用,通知等待池激活一个线程
- notifyall():条件创造后调用,通知等待池激活所有线程
#用法简单示例
import threading,time
from random import randint
class producer(threading.Thread):
def run