跳转到主要内容

基于Python Mongodb的分布式锁

项目描述

# 使用

from mongolock import MongoLock

lock = MongoLock()

# 你可以用它作为上下文
# (如果锁已被另一个工作进程获取,MongoLockLocked将被引发)
with lock('key', 'my_worker_name', expire=60, timeout=10)
# 在这里进行一些工作

# 或者简单地调用方法
if lock.lock('key', 'my_worker_name')
try
# 一些有用的工作
finally
lock.release('key', 'my_worker_name')

# 你也可以通过触摸它来续订锁
with lock('key', 'my_worker_name', expire=60, timeout=10)
# 在这里进行一些长时间的工作
lock.touch('key', 'my_worker_name')

在`lock`方法中的参数

* `key` - 锁定任务的名称
* `owner` - 获取锁的工作进程的名称
* `expire` (可选) - 锁可以被窃取的秒数
* `timeout` (可选) - 我们可以等待锁多长时间(以秒为单位)

# 配置细节

你可以通过指定连接字符串来配置连接,

lock = MongoLock('localhost:27017')

或者通过在MongoLock构造函数中传递配置的MongoClient/MongoReplicaSetClient实例

client = MongoClient('localhost:27017')
lock = MongoLock(client=client)

第二种方法更受青睐,因为这样可以进行更细致的配置

* 使用MongoReplicaSetClient
* 指定写关注
* 指定标签
* 等

# 需要考虑的重要事项

#### 锁窃取和释放

如果你的所有工作进程都使用唯一的名称,那么不应该发生任何奇怪的事情。
考虑以下顺序

* worker1和worker2具有相同的名称:worker
* worker1以expire +30s获得锁
* worker2在30秒后尝试获取锁(worker1仍在工作)
* 当锁过期时,worker2窃取了它
* 现在,worker1结束工作并释放锁,因为它们具有相同的名称 - 锁已释放
* worker3在worker2仍在工作时获取了锁...

#### 锁根本不起作用

如果您使用cron(或类似工具)在不同的机器上启动任务,请考虑机器之间的时间漂移,这将是您任务关键部分的持续时间。


* machine1和machine2的时间漂移为5秒
* machine1上的worker获取了TaskA的锁
* machine1上的worker在1秒内完成了TaskA
* 现在,machine2上的worker介入
* 它不知道machine1上的worker已经完成了TaskA
* 它在TaskA上获取了锁(由于锁在4秒前已释放,所以没有问题)并完成了它

为了防止这种情况,您可以在带有任务名称的键中简单地添加一些时间部分(例如YmdHM)。

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

mongolock-1.3.4.tar.gz (5.0 kB 查看散列值)

上传时间

由以下机构支持

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