使用redis的python分布式读写锁(rwlock)
redisrwlock的Python项目详细描述
使用redis作为服务器的python分布式读写器锁
功能:
- 读写器锁(可以有多个读写器或一个独占读写器)
- 收集到过时的锁(作为单独进程运行,python3 -m redisrwlock)
- 死锁检测
注意:死锁检测和垃圾/陈旧性收集在 客户端,这可能导致redis服务器的I/O过多。调子 使用retry_interval并考虑运行过时的锁集合 适合你的目的。
依赖关系:
- Python3.5.2
- redis py 2.10.5版
- redis 3.2.6
- [测试]覆盖率.py 4.2
安装
pip install redisrwlock
用法
尝试锁定超时=0
当timeout=0时,rwlockclinet.lock充当所谓的try_lock。
fromredisrwlockimportRwlock,RwlockClientclient=RwlockClient()rwlock=client.lock('N1',Rwlock.READ,timeout=0)ifrwlock.status==Rwlock.OK:# Processings of resource named 'N1' with READ lock# ...client.unlock(rwlock)elifrwlock.status==Rwlock.FAIL:# Retry locking or quit
等待锁定成功或死锁
对于timout>;0,rwlockclient.lock将等待锁定成功或 检测到死锁,并选择调用方作为牺牲品。
fromredisrwlockimportRwlock,RwlockClientclient=RwlockClient()rwlock=client.lock('N1',Rwlock.READ,timeout=Rwlock.FOREVER)ifrwlock.status==Rwlock.OK:# Processings of resource named 'N1' with READ lock# ...client.unlock(rwlock)elifrwlock.status==Rwlock.DEADLOCK:# 1. unlock if holding any other locks# 2. Retry locking or quit
移除旧锁
当客户机未解锁时退出,客户机锁的密钥被取消 留在服务器中并阻止其他客户端成功锁定。 redisrblockrun-in命令行删除此类垃圾锁,等待 在服务器上。python3 -m redisrwlock
可以通过指定-r或-repeat选项定期重复此GC。
测试
单元测试
在测试目录中运行nig unittest:
cd test python3 -m unittest -q
或在项目顶部目录中:
python3 -m unittest discover test -q
下面的示例假设您在project top目录中运行unittest。
覆盖范围
coverage erase
coverage run -a -m unittest discover test -q
coverage html
以上简单的覆盖率运行将报告低于预期的覆盖率 因为测试使用子流程。子进程运行的代码不是 默认包含在报告中。
子流程覆盖率
需要一些准备:
编辑sitecustimize.py(在python安装的网站包下) 目录),添加2行
importcoveragecoverage.process_startup()
编辑.coveragerc(coverage.py的配置文件的默认名称)
[run]branch=True[html]directory=htmlcov
然后,使用环境变量运行覆盖率 COVERAGE_PROCESS_START={path/to/coveragerc}
coverage erase
COVERAGE_PROCESS_START=.coveragerc coverage run -a -m unittest discover test -q
coverage html
待办事项
- TOdo:指定redis服务器的命令行选项
- 待办事项:高可用性!redis sentinel还是复制?