Django线程的全局数据

5 投票
1 回答
2377 浏览
提问于 2025-04-18 06:18

我在我的单进程多线程的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请求,使用了另一套访问权限。

撰写回答