Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django芹菜缓存锁不起作用?_Python_Django_Celery - Fatal编程技术网

Python Django芹菜缓存锁不起作用?

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:

我正在尝试使用Django缓存来实现锁定机制。在芹菜官方网站上,它声称Django缓存可以很好地完成这项工作。然而,以我的经验,它不起作用。我的经验是,如果有多个线程/进程几乎同时获得锁(接近~0.003秒),那么所有线程/进程都将成功获得锁。对于在~0.003秒之后获得锁定的其他线程,锁定失败

我是唯一经历过这种情况的人吗?如果可能的话,请纠正我

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是原子的