【问题标题】:Cannot seem able to modify cache value from celery task似乎无法从 celery 任务中修改缓存值
【发布时间】:2019-02-16 22:27:41
【问题描述】:

说明:

我想要一个缓存值(我们称之为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 个方法正确传递,但缓存值似乎没有在任务和视图之间更新。

【问题讨论】:

    标签: python django django-rest-framework celery django-cache


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于@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 是一个文档齐全的库,可以按照说明进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-14
        • 2016-09-23
        • 1970-01-01
        • 2023-03-29
        • 2016-05-03
        • 1970-01-01
        • 2021-04-26
        • 2011-02-17
        相关资源
        最近更新 更多