信号量用于管理一个内部计数器,此计数器逢acquire()递减,逢release()递增。计数器的值不能小于0,如果acquire()被调用时计数器为0,则阻塞,直到某一任务调用release()。
value为可选参数,用于设定内部计数器的初始值。如果给定的值小于0,则引发ValueError异常。
使用信号量的最佳方法是async with声明:
sem = asyncio.Semaphore(10) # ... later async with sem: # work with shared resource等价于:
sem = asyncio.Semaphore(10) # ... later await sem.acquire() try: # work with shared resource finally: sem.release()coroutine acquire()
申请一个信号量
如果内部计数器的值大于0,则减1并立即返回True。如果内部计数器的值为0,则等待release()被调用,然后返回True。
locked()
如果信号量不能被立即申请,则返回True。
release()
释放信号量,内部计数器加1。
与BoundedSemaphore不同,Semaphore允许release()的调用次数大于acquire()的调用次数。
BoundedSemaphoreclass asyncio.**BoundedSemaphore(value=1,*,loop=None)**
有界信号量,非线程安全。
有界信号量是一种特殊的信号量——如果release()后内部计数器的值大于初始值,则引发ValueError异常。
从python3.7开始:通过await lock、yield from lock或通过声明with await lock、with(yield from lock)获取锁的用法被废弃。可使用async with lock代替。