4

자주 사용하지만 자주 계산되지 않는 개체 인 단일 프로세스 다중 스레드 장고 서버에 공유 전역 데이터 개체가 있습니다. 계산에는 많은 시간이 소요되므로 결과를 공유하고 싶습니다.스레드에 대한 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 요청이었고 다른 유효하지 않은 결과 집합).

+0

아마도 바보 같은 질문 일지 모르지만 서버가 단일 프로세스로 실행되고 있습니까? 구성을 게시 할 수 있습니까? –

+0

프로덕션에서는 yes이지만, 단지'manage.py runserver 0.0.0.0 : 8000' 인 개발 환경에서 이러한 동작이 발생합니다. 저는 이것이 항상 단일 프로세스 인 여러 스레드라고 가정했습니다. –

+0

모델/뷰에 계산을 캡슐화하고 해당 모델에서 참조되는 파일에 결과를 저장하는 방법은 무엇입니까? – huu

답변

3

위의 작동합니다. 보조 노트로, 영구 데이터베이스 캐시를 사용하는 것이 LocMemCache보다 선호되는 것 같습니다.

# run python manage.py createcachetable 

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

계산할 때 등 요청 유형 (GET, POST)에 기초하여 변하며, 액세스 제어리스트에 따라 데이터를 입수 한 문제의 근본 원인이 접근 한 세트와 POST 요청했다 , 그리고 그것을 읽을 때 그것은 다른 접근 방식을 가진 GET 요청이었다.

+0

이 작업은 스레드간에 작동합니까? 내 로그에서 동일한 스레드에서 캐시 히트하지만 다른 스레드에서 캐시가 손실 된 것을 볼 수 있습니다. – sureshvv

+0

프로덕션 환경에서'django.core.cache.backends.locmem.LocMemCache'를 사용하고 있으며 스레드간에 작동하는 것처럼 보입니다. 필자는 데이터베이스 캐시를 한번도 시도하지 않았습니다. 정보가 제한되어 있고 단일 서버에 있습니다. –