5

シングルプロセスのマルチスレッドdjan​​goサーバーに共有グローバルデータオブジェクトがあります。これは頻繁に使用されますが、頻繁には計算されません。計算に時間がかかるので、結果を共有したいと思います。

この単純なデータには、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 要求であり、別の (そして無効な) 結果セットを返していました。

4

1 に答える 1

3

上記の作品。補足として、永続的なデータベース キャッシュを使用することは、LocMemCache よりも優先されるようです。

# run python manage.py createcachetable

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

問題の根本的な原因は、リクエスト タイプ (GET、POST) などに基づいて変化するアクセス制御リストに基づいてデータを取得することでした。別のアクセス セットを持つ GET 要求。

于 2014-05-12T15:44:15.540 に答える