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

Joh*_*fis 1 python django django-cache celery django-rest-framework

描述:

我想要一个缓存值(让我们称之为 a flag)来知道 celery 任务何时完成执行。我有一个视图让前端轮询这个标志,直到它变成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',
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  • 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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)
  • views.py

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

问题:

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

Lin*_*via 6

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