又一个python的分布式锁

PyYADL的Python项目详细描述


说明

这是python的另一个带有接口的分布式锁 与标准的lock/rlock类兼容(仅构造函数参数 是不同的,release方法有一个可选参数force

目前只有一个基于redis的实现,但是 很容易扩展基类并使其适应任何其他分布式 存储(像Etcd,数据库-关系和NoSQL,分布式 文件系统等)

redis锁

用法

示例:

创建锁对象

fromPyYADLimportRedisLocklock=RedisLock(name='test_lock',prefix='my_app',ttl=60,existing_connection_pool=None,redis_host='127.0.0.1',redis_port=6379,redis_password='secret',redis_db=0)

参数表示:*name-每个资源都应该有唯一的锁 名称,将在所有系统中共享。Required* 前缀-用于避免名称冲突的前缀。Optional* ttl-锁将激活多少秒如果ttl<;=0,lock将 在释放前有效。OptionalDefault: -1* {STR 1 } $IsvutixIn连接池池< <强>已建立的连接池 Optional*redis\u主机OptionalDefault: localhost* redis_端口OptionalDefault: 6379*redis_密码Optional*redis数据库OptionalDefault: 0

基本用法

fromPyYADLimportRedisLocklock=RedisLock('test_lock')lock.acquire()lock.release()

基本的锁定和释放操作。如果锁已经获得,将等待 对于release或ttl expire

fromPyYADLimportRedisLocklock=RedisLock('test_lock')withlock:# do some taskspass

使用上下文管理器锁定和释放

fromPyYADLimportRedisLocklock1=RedisLock('test_lock')lock2=RedisLock('test_lock')lock1.acquire()lock2.release()

将引发运行时错误(因为锁属于其他实例)

fromPyYADLimportRedisLocklock1=RedisLock('test_lock')lock2=RedisLock('test_lock')lock1.acquire()lock2.release(force=True)

将解除锁定,因为force参数设置为true

fromPyYADLimportRedisLocklock=RedisLock('test_lock')status=lock.acquire(blocking=False)

将获取锁并返回True,如果释放锁,则返回 不等待即为假

fromPyYADLimportRedisLocklock=RedisLock('test_lock')status=lock.acquire(timeout=12)

将尝试获取锁定12秒如果成功的话 true,否则返回false

读写锁

有两种锁子类型:*写锁(典型锁,独占锁)* 读锁(非独占)

同时,只能有一个写锁(主要用于更改) 或多个读锁(主要用于读操作)。如果写锁已经 已获取,无法获取读锁,并且当至少一个读锁 存在,写锁不能被提示。

使用量

示例
fromPyYADLimportRedisWriteLocklock=RedisWriteLock('test_lock')status=lock.acquire(blocking=True,timeout=20)

相当于重新发现类

fromPyYADLimportRedisReadLocklock1=RedisReadLock('test_lock')lock2=RedisReadLock('test_lock')lock1.acquire()lock2.acquire()

将创建两个读锁(同时可以有多个读锁 锁)

fromPyYADLimportRedisReadLock,RedisWriteLocklock1=RedisReadLock('test_lock')lock2=RedisReadLock('test_lock')lock3=RedisWriteLock('test_lock')lock1.acquire()lock2.acquire()lock3.acquire()

将只获取lock1和lock2(当 存在其他锁)

fromPyYADLimportRedisReadLock,RedisWriteLocklock1=RedisWriteLock('test_lock')lock2=RedisReadLock('test_lock')lock1.acquire()lock2.acquire()

只获取锁1(当存在写锁时,读锁不能) 获得)

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

推荐PyPI第三方库


热门话题
java web爬虫:使用selenium+webdriver遍历页面链接时出现两种异常   java JPA和SYS_REFCURSOR-like OUT参数   非空参数的java方法引用?   xml中的java子节点名称   java为什么GC不在同一个方法中运行   java如何检查可执行JAR是否已在另一个JVM中完成   将外观更改为Nimbus后出现jtable Java错误   用户界面Java Swing架构问题?   java导入自定义字体时我做错了什么?   java如何用API制作可伸缩的游戏策划   java玩家和方块的碰撞和交集   java增强的for循环   java propertiesmavenplugin不适用于目标writeprojectproperties   java循环返回代码的开头   java使用分号执行apachecommonsexec多个命令   Wicket应用程序中的java全局可访问资源   java在eclipse中设置参数时可以使用类名而不是id吗?   eternal和maxElementsInMemory在ehcache中的java角色?   java ClassCastException在同一个ear中从两个不同的WAR加载同一个类时,由于类装入器不同