基于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)。
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的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | f261dc41ee6acd80e79ae75acc9fdd8c4f018b363041e1d33ec145d2250c26bd |
|
MD5 | 69a09be87a1d3b9493023116ea6eec96 |
|
BLAKE2b-256 | 7b4107ce80317f0d4a9ac14900002246b432584e428ad507825714df37460973 |