asyncio异步IO--同步原语 (2)

信号量用于管理一个内部计数器,此计数器逢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()的调用次数。

BoundedSemaphore

class 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代替。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssfgs.html