是用来控制线程并发数的,BoundeSemaphore 或Semaphore管理一个内置的计数器,每当调用acquire()时减一,调用release()时加一。计数器不能小于0,当计数器为0时,acquire将阻塞线程至同步锁定状态,直到其他线程调用release(),类似于停车位的概念
BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release时检查计数器的值是否超过计数器的初始值,如果超过了将抛出一个异常。
-
使用
import threading import time def go(): if s.acquire(): print('go go go') time.sleep(1) s.release() if __name__ == '__main__': s = threading.Semaphore(2) # 限制并发数为2 for i in range(5): threading.Thread(target=go).start()
-
简写
s = threading.Semaphore(2) # 限制并发数为2 with s: ...
import threading import time def go(): # if s.acquire(): with s: print('go go go') time.sleep(1) # s.release() if __name__ == '__main__': s = threading.Semaphore(2) # 限制并发数为2 for i in range(5): threading.Thread(target=go).start()