跳转到主要内容

使用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值上获取一个唯一的序列号。只有在另一个名为指示器的值与唯一的序列号对应时,才能获取锁。

有两种机制可以更改指示器

  1. 具有相应序列号的用户完成对共享资源的操作并增加该数字,通知任何其他已订阅的等待用户。这是处理事情的首选方式。

  2. 另一个用户不耐烦并调用碰撞过程。此过程检查与指示器对应的用户是否仍在活动状态,并在必要时将指示器设置为适当的值。

活动通过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 (24.8 kB 查看哈希值)

上传时间

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面