使用python和redis实现的共享资源锁定队列系统。
项目描述
Turn
简介
Turn是一个使用python和Redis实现的共享资源锁定队列系统。在需要访问相同共享资源的独立程序中使用它,以确保每个程序都能轮到处理资源。
它受到了在小型商店中有时发现的排队系统(由序列号发放机和墙式指示器组成)的启发。
Turn包含一个命令行工具,用于重置和直接检查队列,并监听一个或多个资源的消息通道。
安装
使用pip安装turn
$ pip install turn
当然,您也应该拥有一个Redis服务器。
使用
基本使用如下
import turn # a locker corresponds to a reusable Redis client locker = turn.Locker(host='localhost', port=6379, db=0) resource = 'my_valuable_resource' label = 'This shows up in messages.' with locker.lock(resource=resource, label=label): pass # do your careful work on the resource here
lock()接受两个额外的关键字参数
expire: 用户存在的最大过期值(默认60)
如果用户硬崩溃,其在队列中的存在最多保持expire秒。此值会影响EXPIRE命令发送到Redis的频率,以表示用户在队列中的持续存在。
耐心:在碰撞队列之前的等待时间(默认值60)
如果程序等待时间超过此值,且在队列的pubsub通道上没有收到任何进度消息,则将碰撞队列以查看是否有用户以异常方式离开队列。
工具
用户和队列的状态可以通过检查Redis值和订阅Redis通道来监控。
可以使用控制台脚本来请求快照状态报告进行监控。
$ turn status my_valuable_resource --host localhost my_valuable_resource 5 ------------------------------------------------------------ This shows up in status reports and messages. 5
运行turn status而不指定任何资源,将生成数据库中所有队列的摘要。
或者,可以订阅特定资源的Redis PubSub通道以进行跟踪。
$ turn follow my_valuable_resource --port 6379 my_valuable_resource: 5 assigned to "This shows up in messages." my_valuable_resource: 5 started my_valuable_resource: 5 completed by "This shows up in messages." my_valuable_resource: 6 granted
与状态命令类似,运行turn follow而不指定任何资源将开始跟踪数据库中当前任何队列的通道。注意,新队列不会自动添加到订阅中。
还可以使用turn reset从Redis中重置(删除)队列,可选地跟随着资源队列来重置。不指定资源名称的重置将重置服务器上所有可用的队列。如果资源的队列显示活动,则不会重置,并且还会生成一条消息。对资源的重置命令也会“碰撞”该资源的队列。
实现细节
当请求锁时,从Redis通过INCR在名为分配器的Redis值上获取一个唯一的序列号。只有在另一个名为指示器的值与唯一的序列号对应时,才能获取锁。
有两种机制可以更改指示器
具有相应序列号的用户完成对共享资源的操作并增加该数字,通知任何其他已订阅的等待用户。这是处理事情的首选方式。
另一个用户不耐烦并调用碰撞过程。此过程检查与指示器对应的用户是否仍在活动状态,并在必要时将指示器设置为适当的值。
活动通过Redis中的过期键值对进行监控。turn库自动安排一个线程来更新过期时间,以确保在等待或处理资源时,存在性不会过期。
开发安装
对于开发,您可以使用docker-compose设置
$ docker-compose build --build-arg uid=`id -u` --build-arg gid=`id -g` lib $ docker-compose up --no-start $ docker-compose start $ docker-compose exec lib bash
(重新)创建并激活虚拟环境
(docker)$ rm -rf .venv (docker)$ virtualenv --system-site-packages .venv (docker)$ source .venv/bin/activate
安装依赖项和包并运行测试
(docker)(virtualenv)$ pip install -r requirements.txt (docker)(virtualenv)$ pip install -e .[test] (docker)(virtualenv)$ pytest
更新requirements.txt
(docker)$ rm -rf .venv (docker)$ virtualenv --system-site-packages .venv (docker)$ source .venv/bin/activate (docker)(virtualenv)$ pip install . (docker)(virtualenv)$ pip uninstall turn --yes (docker)(virtualenv)$ pip freeze > requirements.txt
鸣谢
由Arjan Verkerk编写
变更记录
1.0 (2020-03-04)
向setup.py添加分类器。
移除对python2的支持
添加密码支持
添加Docker开发设置
0.5 (2015-12-28)
Python 3兼容。
在控制台中添加锁定工具,用于锁定多个资源。
0.4 (2015-04-30)
向控制台脚本添加更多帮助。
添加有关安全性的重要测试。
0.3.1 (2015-04-30)
测试和文档的重新排序。
0.3 (2015-04-30)
所有代码均通过测试覆盖。
扩展文档。
0.2.1 (2015-04-28)
耐心调整为秒。
自动关闭PubSub连接。
将耐心作为lock()的参数。
更新文档。
0.2 (2015-04-28)
调整文档。
将控制台内容移至单独的模块。
使用select而不是poll,以提高平台独立性。
使用“Locker”名称为可重复使用的对象命名,用于锁定事物。
0.1.1 (2015-04-23)
现在可以使用pip。
0.1 (2015-04-23)
使用nensskel 1.36.dev0创建初始项目结构。
第一个工作版本。
项目详情
turn-1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 392ed33a97e3a461b49a479280bd003327a27437f02d708a8e335aee06c90f9f |
|
MD5 | f38811e544d201393ecbe60118b1fab6 |
|
BLAKE2b-256 | eae4c5e1b597557ac9f6b7d78c41d3bf80cc172e62e2da7a37e6a2ff4a4e18fe |