Python Django芹菜缓存锁不起作用?
我正在尝试使用Django缓存来实现锁定机制。在芹菜官方网站上,它声称Django缓存可以很好地完成这项工作。然而,以我的经验,它不起作用。我的经验是,如果有多个线程/进程几乎同时获得锁(接近~0.003秒),那么所有线程/进程都将成功获得锁。对于在~0.003秒之后获得锁定的其他线程,锁定失败 我是唯一经历过这种情况的人吗?如果可能的话,请纠正我Python Django芹菜缓存锁不起作用?,python,django,celery,Python,Django,Celery,我正在尝试使用Django缓存来实现锁定机制。在芹菜官方网站上,它声称Django缓存可以很好地完成这项工作。然而,以我的经验,它不起作用。我的经验是,如果有多个线程/进程几乎同时获得锁(接近~0.003秒),那么所有线程/进程都将成功获得锁。对于在~0.003秒之后获得锁定的其他线程,锁定失败 我是唯一经历过这种情况的人吗?如果可能的话,请纠正我 def acquire(self, block = False, slp_int = 0.001): while True:
def acquire(self, block = False, slp_int = 0.001):
while True:
added = cache.add(self.ln, 'true', self.timeout)
if added:
cache.add(self.ln + '_pid', self.pid, self.timeout)
return True
if block:
sleep(slp_int)
continue
else:
return False
# Set Django backend cache to localcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/dev/shm/django_cache',
}
}
问题是Django不保证
.add()
的原子性实际上,.add()
是否是原子的取决于您使用的后端。对于FileBasedCache
,.add()
不是原子的:
def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
if self.has_key(key, version):
return False
self.set(key, value, timeout, version)
return True
执行.add()
的工作者A可以在self.has_key(…)
之后,但在self.set(…)
之前被抢占。工人B一次执行.add()
,将成功设置键并返回True
。当worker A恢复时,它还将设置键并返回True
这表明您查看的示例代码假定后端是Memcached。如果您使用Memcached或支持原子的后端
.add()
,那么它应该可以工作。Memcached和默认的locmem是原子的