Django线程的全局数据
我在我的单进程多线程的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 个回答
3
上面的内容是有效的。顺便提一下,使用持久化数据库缓存似乎比使用LocMemCache更受欢迎。
# run python manage.py createcachetable
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table'
}
}
问题的根本原因在于根据访问控制列表来获取数据,而这个列表是根据请求类型(比如GET、POST等)而变化的。在计算时,这是一个POST请求,使用了一套访问权限;而在读取时,则是一个GET请求,使用了另一套访问权限。