使用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。

测试

单元测试

  1. 在测试目录中运行nig unittest:

    cd test
    python3 -m unittest -q
  2. 或在项目顶部目录中:

    python3 -m unittest discover test -q

下面的示例假设您在project top目录中运行unittest。

覆盖范围

coverage erase
coverage run -a -m unittest discover test -q
coverage html

以上简单的覆盖率运行将报告低于预期的覆盖率 因为测试使用子流程。子进程运行的代码不是 默认包含在报告中。

子流程覆盖率

需要一些准备:

  1. 编辑sitecustimize.py(在python安装的网站包下) 目录),添加2行

    importcoveragecoverage.process_startup()
  2. 编辑.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还是复制?

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

推荐PyPI第三方库


热门话题
jframe为什么JAVA paint()方法不起作用?   java Guice:将ContainerRequestContext注入拦截器   java如何优雅地关闭Spring JMS MessageListenerAdapter   java如何在Spring中设置快照隔离级别   Java中的安卓平台独立信任存储路径   java无法在eclipse中运行hello world程序   java Sinch空指针问题   使用Java将JSON流式传输到BigQuery   java从“大数据”中选择什么Swing控件?   java通过对象字段过滤/排序集合?   java将数据从活动传递到另一个活动中的片段   java访问打包在jar文件中的文档   Java获取事件的大小。getDragboard()。getFiles()。流()。映射(文件::长度)。toString());   java Android libgdx:启动程序图标按下后,启动屏幕不会立即显示   java如何在Google App Engine灵活环境中配置oracle jdk   java有没有办法减少这些行?   Java:客户端socket不读取第二行,在终止符行之后保持打开状态   java以编程方式获取api 29上的所有APK文件   java ActionBar按钮不显示