使用DB(MySQL/Postgres)为Django提供分布式锁。
django-database-locks的Python项目详细描述
使用数据库(MySQL/Postgres)的Django分布式锁
考虑到Percona集群不支持MySQL锁的限制,这个应用程序使用select\u for_update()实现锁(行锁)。在
安装
pip install django-database-locks
使用
django数据库锁公开了一个锁contextmanager和锁定的修饰符。在
锁定的修饰符将包装django管理命令(属于的子类django.core.management公司.base.base命令)或任何具有锁的函数contextmanager:
fromdjango.core.management.baseimportBaseCommandfromdatabase_locksimportlocked@lockedclassCommand(BaseCommand):...defhandle(self,*args,**options):self.stdout.write('Got the lock')^{pr2}$
fromdatabase_locksimportlockclassSomeClass:defnon_locked(self):passdeflocked(self):withlock():print('got lock')
文件
锁定和锁定的具有相同的可选参数:
:paramlock_name:uniquenameinDBforthisfunction:paramtimeout:numbersofsecondstowaittoacquirelock:paramlock_ttl:expirationtimerofthelock,inseconds(settoNonetoinfinite):paramlocked_by:owneridforthelock(iflockisactivebutowneristhesame,returnsacquired):paramauto_renew:ifsettoTruewillre-acquirelock(for`lock_ttl`seconds)before`lock_ttl`isover.auto_renewthreadwillraiseKeyboardInterruptonthemainthreadincasere-acquiringfails:paramretry:retryevery`retry`secondsacquiringuntilsuccessful.settoNoneor0todisable.:paramlost_lock_cb:callbackfunctionwhenlockislost(whenre-acquiring).defaultstoraisingLockException
您还可以在项目中指定以下选项设置.py
- DATABASE_LOCKS_STATUS_FILE:将使用锁状态更新的文件(默认值None)。当您有多个共享锁进程时非常有用,可以快速检查哪个进程拥有锁。在
- DATABASE_LOCKS启用:设置为False全局禁用锁(默认True)
- 项目
标签: