又一个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
读写锁
有两种锁子类型:*写锁(典型锁,独占锁)* 读锁(非独占)
同时,只能有一个写锁(主要用于更改) 或多个读锁(主要用于读操作)。如果写锁已经 已获取,无法获取读锁,并且当至少一个读锁 存在,写锁不能被提示。