基于python mongodb的分布式锁
mongolock的Python项目详细描述
#用法
from mongolock import mongolock
超时=10):
这里有些工作
或者只通过调用方法:
if lock.lock('key','my戥worker戥name'):
尝试:
一些有用的工作
最后:
lock.release('key','my戥worker戥name')
'my_worker_name',expire=60,timeout=10):
*` timeout`(可选)-等待锁的时间(秒)
client=mongoclient('localhost:27017')
lock=mongolock(client=client)
首选第二个,这样,您就可以执行更细粒度的配置:
*使用mongoreplicasetclient
*指定写入关注点
*指定标记
*等
需要考虑的重要事项
如果不这样做-可能会发生一些奇怪的事情。
请考虑以下顺序:
*worker1和worker2具有相同的名称:worker
*worker1在expire+30s时实现锁定
*worker2在30s后尝试获取锁定(worker1仍在工作)
*Worker2窃取它,现在Worker1结束工作并释放锁,因为它们有相同的名称-锁被释放,Worker3接受锁,而Worker2仍在工作…
将机器之间的时间漂移也作为任务关键部分的持续时间来考虑。
*machine1和machine2有时间漂移5s
*machine1上的工人锁定任务a
*machine1上的工人在1s内完成任务a
*现在machine2上的工人开始工作了
*它不知道machine1上的工人已经完成了task a
*需要锁定taska(没有问题,因为锁在4s前已经释放)并执行此操作
为了防止出现这种奇怪的情况,您可以简单地将部分时间(例如ymdhm)添加到具有任务名称的密钥中。
from mongolock import mongolock
超时=10):
这里有些工作
或者只通过调用方法:
if lock.lock('key','my戥worker戥name'):
尝试:
一些有用的工作
最后:
lock.release('key','my戥worker戥name')
'my_worker_name',expire=60,timeout=10):
*` timeout`(可选)-等待锁的时间(秒)
client=mongoclient('localhost:27017')
lock=mongolock(client=client)
首选第二个,这样,您就可以执行更细粒度的配置:
*使用mongoreplicasetclient
*指定写入关注点
*指定标记
*等
需要考虑的重要事项
如果不这样做-可能会发生一些奇怪的事情。
请考虑以下顺序:
*worker1和worker2具有相同的名称:worker
*worker1在expire+30s时实现锁定
*worker2在30s后尝试获取锁定(worker1仍在工作)
*Worker2窃取它,现在Worker1结束工作并释放锁,因为它们有相同的名称-锁被释放,Worker3接受锁,而Worker2仍在工作…
将机器之间的时间漂移也作为任务关键部分的持续时间来考虑。
*machine1和machine2有时间漂移5s
*machine1上的工人锁定任务a
*machine1上的工人在1s内完成任务a
*现在machine2上的工人开始工作了
*它不知道machine1上的工人已经完成了task a
*需要锁定taska(没有问题,因为锁在4s前已经释放)并执行此操作
为了防止出现这种奇怪的情况,您可以简单地将部分时间(例如ymdhm)添加到具有任务名称的密钥中。