在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第三方库


热门话题
windows如何告诉IntelliJ使用Java1.6JDK启动gradle?   使用java获取计算机中硬盘的真实序列号   java从图像数组中选择随机图像   java如何给方法输入参数并打印返回值   java正则表达式验证显示有问题的字符。javax。验证   java有没有一种从Jar/war中删除文件的快速方法,而不必提取Jar并重新创建它?   java Hibernate OrderColumn和Spring Roo   java在没有模拟的情况下测试Spring REST API   java JPA/Hibernate不希望的部分回滚和会话处理   java什么是zookeeper的合适版本?   在带有数组的循环中创建变量时出现Java编译错误   java如何正确使用C++中的JNI JVM?   java如何根据条件从firebase数据库获取图像url并将其加载到ImageView中?   为什么它在Java泛型中作为返回类型而不是类型?   jar压缩和解压在java中   java如何比较整数与整数数组   引用对象Java类字段?   com JACOB java lib,调用函数时运行ActiveX对象获取错误灾难性失败