在asyncio python中制作同步原语的灵活的低级工具

fifolock的Python项目详细描述


五色CircleCIMaintainabilityTest Coverage

一个灵活的低级工具,用于在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可重入的这一事实是经过深思熟虑的:为其设计的算法类不需要这样做。这会增加不必要的复杂性,并且可能会更慢。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何复制二维字符串数组?   java Realworld参数优化   输入创建一个Java程序,读取。txt并标识三角形边长   java Apache HttpClient上传后文件无法与MultipartEntityBuilder上传一起使用   java如何从单独的类文件中随机选择两个枚举值   Java获取两个正则表达式之间所有字符串的最佳方法?   java如何将按钮链接到微调器?   java改造2.0:如何映射不同类型的对象   java如何检查Antlr3中的数字范围?   java使用JNDI查找EJB Bean   java构造函数字符串、字符串、int、int、Optional<>在spring boot中未定义   java如何使用jruby(使用jetty运行)创建servlet?   JavaFX:为什么在背景改变之前我必须按下按钮几次?   java可以为违反映射契约的映射生成重复的JSON对象属性名吗?   JavaJSOUP从网站获取某些属性   Eclipse:如何使java文件夹显示为树?   如何在Java中从Matcher获取多个正则表达式组?   构造函数中带有参数的lambda Java 8供应商   java是否可以在ExtJS 3.2中对日期进行自定义排序