关于threading.Semaphore()和threading.BoundedSemaphore()计数器工作如何输出,以及两个有什么不同:
threading.Semaphore(value=1):
可通过acquire(block=[bool],timeout=None)获取,也就是对value减一.
1 当block=True,timeout=None,acquirec()次数超过value,线程阻塞一直等待
2 当block=False,timeout=None,acquire()次数超过value时,不会报错,只是超出的部分会返回False
3 当设置了timeout时,最多阻塞timeout秒的时间,如果超时则返回False
可通过release() 释放,也就是对value加一,
1 可以唤醒等待状态的线程,只会唤醒一条,哪一条随机。
2 Semaphore 对超过value数的release()不会报错。
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()