2016-01-27 1 views
2

Я пытаюсь использовать кеш Django для реализации механизма блокировки. В Celery offical site он утверждал, что кэш Django отлично подходит для этого. Однако в моем опыте это не сработало. Мой опыт в том, что если несколько потоков/процессов получают блокировку почти в одно и то же время (около ~ 0,003 секунды), все потоки/процессы будут успешно блокировать блокировку. Для других потоков, которые приобретают блокировку позже, чем ~ 0.003 секунды, она терпит неудачу.Блокировка кеша сельдерей Django не работает?

Я один человек испытал это? Пожалуйста, поправьте меня, если это возможно.

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',                                                
    } 
} 

ответ

3

Проблема заключается в том, что 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() может быть вытеснен после self.has_key(...) но перед self.set(...). Рабочий B, выполняющий .add() за один выстрел, успешно установил ключ и вернул True. Когда рабочий A возобновится, он также установит ключ и вернет True.

Этот issue report указывает, что пример кода, на который вы смотрите, предполагает, что бэкэнд Memcached. Если вы используете Memcached или бэкэнд, поддерживающий атомный .add(), тогда он должен работать.

Смежные вопросы