Кажется, не может изменить значение кэша из задачи сельдерея - PullRequest
0 голосов
/ 12 сентября 2018

Описание:

Я хочу иметь кэшированное значение (назовем его flag), чтобы знать, когда задача сельдерея заканчивает выполнение. У меня есть вид для внешнего интерфейса, чтобы опрашивать этот флаг, пока он не превратится в False.

Код:

  • settings.py:

    ...
    MEMCACHED_URL = os.getenv('MEMCACHED_URL', None) # Cache of devel or production
    if MEMCACHED_URL:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': MEMCACHED_URL,
             }
        }
    else:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                'LOCATION': 'unique-snowflake',
            }
        }
    
  • api/views.py

    def a_view(request):
        # Do some stuff
        cache.add(generated_flag_key, True)
        tasks.my_celery_task.apply_async([argument_1, ..., generated_flag_key])
        # Checking here with cache.get(generated_flag_key), the value is True.
        # Do other stuff.
    
  • tasks.py

    @shared_task
    def my_celery_task(argument_1, ..., flag_cache_key):
        # Do stuff
        cache.set(flag_cache_key, False) # Checking here with 
                                         # cache.get(flag_cache_key),the
                                         # flag_cache_key value is False
    
  • views.py

    def get_cached_value(request, cache_key):
        value = cache_key.get(cache_key) # This remains True until the cache key 
                                         # expires.
    

Проблема:

Если я запускаю задачу синхронно, все работает как положено. Когда я запускаю задачу асинхронно, ключ кэша остается тем же (как и ожидалось), и он правильно передается через эти 3 метода, но кэшированное значение не обновляется между задачей и представлением.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

После ответа @ Linovia и погружения в документацию Django я теперь использую django-redis в качестве обходного пути для моего случая.

Единственное, что нужно изменить - это настройки CACHES (и, конечно, активный сервер Redis!):

settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": 'redis://127.0.0.1:6379/1',
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

Теперь кэш-память единственного числа.
django-redis - это хорошо документированная библиотека, и для ее работы можно следовать инструкциям.

0 голосов
/ 12 сентября 2018

Если вы выполняете свои задачи асинхронно, они являются частью разных процессов, а это означает, что из-за бэкэнда LocMemCache задача и представление не будут использовать одно и то же хранилище (у каждого своя память).

...