Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器

关于threading.Semaphore()和threading.BoundedSemaphore()计数器工作如何输出,以及两个有什么不同:
threading.Semaphore(value=1):

可通过acquire(block=[bool],timeout=None)获取,也就是对value减一.

1 当block=True,timeout=None,acquirec()次数超过value,线程阻塞一直等待
Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器_第1张图片
2 当block=False,timeout=None,acquire()次数超过value时,不会报错,只是超出的部分会返回False
Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器_第2张图片
3 当设置了timeout时,最多阻塞timeout秒的时间,如果超时则返回False

可通过release() 释放,也就是对value加一

1 可以唤醒等待状态的线程,只会唤醒一条,哪一条随机。

2 Semaphore 对超过value数的release()不会报错。
Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器_第3张图片

threading.BoundedSemaphore(value=1):

与Semaphore不同点在于:

对于过多的release()会报错:

'''尝试BoundedSemaphore acquire()次数超过value、release()次数超过value,分别是什么情况'''
candy_store=threading.BoundedSemaphore(value=5)
def take_out():
    for i in range(7):
        time.sleep(1)
        rate=candy_store.acquire(blocking=False,)
        # rate=candy_store.release()
        print(f'释放{str(i+1)}个'+str(rate))
    for i in range(7):
        time.sleep(1)
        # rate=candy_store.acquire(blocking=False,)
        rate=candy_store.release()
        print(f'释放{str(i+1)}个'+str(rate))
threading.Thread(target=take_out,name='Semaphore取出').start()

Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器_第4张图片
!!!注意一点,一个计数器创建时,为满状态。

你可能感兴趣的:(python)