在我的单进程多线程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请求,并且返回一组不同的(无效的)结果。
以上工作。顺便说一句,使用持久数据库缓存似乎比使用LocMemCache更可取。
# run python manage.py createcachetable
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table'
}
}
问题的根本原因是基于访问控制列表检索数据,该列表根据请求类型(GET、POST)等而变化。在计算时,这是一个具有一组访问权限的POST请求,而在读取时,它是一个具有不同访问权限的GET请求。