似乎无法从celery任务修改缓存值

问题描述 投票:0回答:2

描述:

我希望有一个缓存值(让我们称之为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.pydef 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.pydef get_cached_value(request, cache_key): value = cache_key.get(cache_key) # This remains True until the cache key # expires.

问题:

如果我同步运行任务,一切都按预期工作。当我异步运行任务时,缓存键保持不变(如预期的那样)并且通过这3种方法正确传递,但缓存的值似乎在任务和视图之间不会更新。

python django django-rest-framework celery django-cache
2个回答
1
投票

如果异步运行任务,它们是不同进程的一部分,这意味着由于LocMemCache后端,任务和视图将不使用相同的存储(每个都有自己的内存)。


0
投票

自@ 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是一个记录良好的库,可以按照说明使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.