Skip to content

Latest commit

 

History

History
58 lines (37 loc) · 1.26 KB

File metadata and controls

58 lines (37 loc) · 1.26 KB

信号量

是用来控制线程并发数的,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()