Django线程的全局数据

时间:2014-05-12 14:28:58

标签: python django multithreading python-multithreading django-cache

我的单进程多线程django服务器中有一个共享的全局数据对象 - 一个经常使用的对象,但不经常计算。计算非常耗时,所以我想分享结果。

我认为使用django的LocalMemCache来处理这个简单的数据是有效的。奇怪的是,它似乎适用于单页加载的多个ajax调用,但出于某种原因,当我在浏览器中重新加载页面时,缓存再次为空。

我做错了什么?

有更好的方法吗?如果我用线程锁控制写访问,那么全局变量是否同样有效?

这基本上就是我正在做的事情:

from threading import Lock
from django.core.cache import get_cache

my_lock = Lock()
cache = get_cache('default')

def get_global_data():
    my_lock.acquire()
    try:
        cached_data = cache.get('data')
        if not cached_data:
            cached_data = big_function_to_calculate_data()
            cache.set('data', cached_data)
    finally:
        my_lock.release()
    return cached_data

# settings.py defines my django LocMemCache as:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'my_server'
    }
}

修改

问题的根本原因是基于访问控制列表(此处不是代码的一部分)检索数据,这些列表因请求类型(GET,POST)等而异。计算时,这是一个POST请求一组访问,当读取它时是一个具有不同访问权限的GET请求,并返回一组不同(和无效)的结果。

1 个答案:

答案 0 :(得分:3)

以上作品。另外,使用持久性数据库缓存似乎比LocMemCache更受欢迎。

# run python manage.py createcachetable

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table'
    }
}

问题的根本原因是基于访问控制列表检索数据,该列表根据请求类型(GET,POST)等而变化。在计算时,这是一个具有一组访问权限的POST请求,并且在读取时这是一个具有不同访问权限的GET请求。