2014-07-07 2 views
0

파이썬 응용 프로그램의 많은 sqlalchemy 객체를 기반으로 큰 객체 (재생 영역)가 있습니다.uwsgi 매핑 요청을 처리합니다.

간단한 요청 (예 : 플레이어 이동)마다이 개체를 만들어야하며 리소스 집약적입니다. 글로벌 변수에 준비된 객체를 캐시 할 수 있습니다.

하지만 단일 uwsgi 스레드를 사용하는 경우에만 작동합니다.

cache = {} 

def applicatio(field_id): 
    global cache 
    if field_id not in cache.keys(): 
     field = get_field(field_id) 
     cache[field_id] = field 
    field.move_player() 

내 개체가 64KB보다 커서 uwsgi.cache을 사용할 수 없습니다. 그리고 데이터베이스 연결을 기반으로 객체에 좋은 기능이 있는지 확신 할 수 없습니다.

또 다른 문제가 있습니다. 두 요청이 서로 다른 프로세스에 동시에 도착하면 충돌이 발생할 수 있습니다.

따라서 요청을 동일한 스레드에 매핑하려고합니다. nginx에서 사용할 수 있습니다 hash $arg_field_id;

하지만 다른 소켓으로 많은 uwsgi 프로세스를 생성해야합니다. IMHO 나쁜 생각이야.

uwsgi가이 논리를 실현할 수 있습니까? 또는

프로세스간에 개체를 공유하는 방법을 아는 사람이 있습니까? 여기에 설명 된대로 당신은 단지 조정을 원하는

답변

1

uWSGI 캐시는 큰 될 수 있습니다

http://uwsgi-docs.readthedocs.org/en/latest/Caching.html#cache2-options

, BTW는별로 정의하는 프로세스로, 당신 접근 방식은 여러 프로세스가 작동하지 않습니다 정상 주소 공간을 다른 사람들과 공유하지 않습니다. 스레드를 사용할 수 있지만 (영역을 만들 때 적절한 잠금 기능이 있음) 실제로 uwsgi 캐시는 프로세스가 더 쉽고 (자동으로 프로세스에서 공유 됨) 유용합니다.

조건의 경우)

thread1 : uwsgi.cache_set ('갑'big_data : uwsgi.cache_set ('갑'big_data)

thread2 : big_data)

thread3 uwsgi.cache_set ('갑')

처음으로 취득하는 다시 자동 캐시 잠금은 새로운 개체를 만들 것입니다, 다른 두 옵션은 아무 작업도 수행되지 않습니다

+0

고마워요! 나는 부주의했다. 그리고이 문서를 읽는다. 나는 이것을 저녁에 시험 할 것이다. –

+0

흠. uwsgi.cache가 내 개체를 캐시 할 수 없다고 생각할 때 나는 옳았다. –

+0

왜? 모든 얼룩을 저장할 수 있습니다. 분명히 복잡한 파이썬 개체를 저장하려면 다른 캐싱 서버와 마찬가지로 피클 링/마샬링/직렬화를 수행해야합니다. – roberto

관련 문제