在asyncio python中制作同步原语的灵活的低级工具
fifolock的Python项目详细描述
五色
一个灵活的低级工具,用于在AysiCIO Python中制作同步原语。顾名思义,锁严格按照请求的顺序授予:先进先出;不可重入。
安装
pip install fifolock
配方
互斥锁
importasynciofromfifolockimportFifoLockclassMutex(asyncio.Future):@staticmethoddefis_compatible(holds):returnnotholds[Mutex]lock=FifoLock()asyncdefaccess():asyncwithlock(Mutex):# access resource
读/写(共享/独占)锁
importasynciofromfifolockimportFifoLockclassRead(asyncio.Future):@staticmethoddefis_compatible(holds):returnnotholds[Write]classWrite(asyncio.Future):@staticmethoddefis_compatible(holds):returnnotholds[Read]andnotholds[Write]lock=FifoLock()asyncdefread():asyncwithlock(Read):# shared accessasyncdefwrite():asyncwithlock(Write):# exclusive access
信号量
importasynciofromfifolockimportFifoLockclassSemaphoreBase(asyncio.Future):@classmethoddefis_compatible(cls,holds):returnholds[cls]<cls.sizelock=FifoLock()Semaphore=type('Semaphore',(SemaphoreBase,),{'size':3})asyncdefaccess():asyncwithlock(Semaphore):# at most 3 concurrent accesses
运行测试
python setup.py test
设计选择
锁的每个模式都是asyncio.Future
的一个子类。这可以看作是FifoLock
的一些内部漏洞,但它允许清除客户端和内部代码。
类是散列的,因此每个类都可以是传递给
is_compatible
方法的holds
字典中的键。这允许在客户机代码中清楚地读取兼容性条件,并在内部清楚地修改holds
字典。在
FifoLock
中创建的一个实例是both等待的对象,并以访问其is_compatible
方法的方式存储在deque中。它是一个类而不是类的实例这一事实也清楚地表明,它不存储任何状态,而只存储配置。
缺点是,对于可配置模式,比如信号量,客户端必须动态创建一个类:这不是一个常用的模式。
锁是not可重入的这一事实是经过深思熟虑的:为其设计的算法类不需要这样做。这会增加不必要的复杂性,并且可能会更慢。