シングルプロセスのマルチスレッドdjangoサーバーに共有グローバルデータオブジェクトがあります。これは頻繁に使用されますが、頻繁には計算されません。計算に時間がかかるので、結果を共有したいと思います。
この単純なデータには、django の LocalMemCache を使用するとうまくいくと思いました。奇妙なことに、1 回のページ読み込みで複数の 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) などによって異なります。計算すると、これは 1 セットの POST 要求でした。アクセスし、それを読み取るときは、別のアクセス セットを持つ GET 要求であり、別の (そして無効な) 結果セットを返していました。