2014-06-12 6 views
0

최근에 나는이 라인WSGI - 모든 것이 "환경"라인 아래로 가야 "전역 적으로"캐시되지 않습니다.

def application(environ, start_response): 

위의 파이썬 코드를 삽입하는 8 개 스레드에 캐시되는 일이 발생할 것을 발견했다.

내 아파치 오류 로그 파일을 기반으로합니다. wsgi 스크립트를 반복해서 다시로드하고 wsgi 스크립트로 8 개의 스레드 (프로세스)를 생성했습니다. 텍스트 file.txt를이 코드 아래 즉

..

import os 
ooo = os.popen('/text-file.txt').read() 

def application(environ, start_response): 
    start_response('200 OK', [('content-type', 'text/html')]) 
    yield ooo 

내용은 8 개 개의 다른 스레드에서 실제로

cached 

있습니다. WSGI 스크립트 후

는 .. 등이 8 캐시 중 무작위로 하나를 선택합니다 및

/text-file.txt 

가 수정 업데이트되면 따라서도 문제가되지 않습니다 .. 8 개 다른 스레드와 캐시이 8 다른 시간을 만들어 ..

솔루션은이 같은 싸다 라인 아래

 ooo = os.popen('/text-file.txt').read() 

을 배치 할 것 같다

import os 

def application(environ, start_response): 
    ooo = os.popen('/text-file.txt').read() 
    start_response('200 OK', [('content-type', 'text/html')]) 
    yield ooo 

위의 코드는 정상적으로 작동합니다.

ooo = os.popen('/text-file.txt').read() 

은 파일의 실시간 읽기를 기반으로하며 여덟 개의 프로세스가 8 개의 다른 시간에 캐시되지 않습니다. 나는 그런

ooo = os.popen('/text-file.txt') 
ooo2 = ooo.read() 
ooo3 = "something" 
ooo4 = "something else" 

내가 기본적으로 말은 너무 많은 라인 같은 경우

여기 질문은 ...

이 모든 것은

와 환경 라인

에서 가야 할 것

하지만 예를 들어 wsgi 스크립트에서 40 개가 있으면 어떻게 될까요? 여기 모두가

 def application(environ, start_response): 

아래에 배치해야합니다 .. 같은 너무 많은 일들이있을 경우

import os 

def application(environ, start_response): 
     ooo = os.popen('/text-file.txt') 
     ooo2 = ooo.read() 
     ooo3 = "something" 
     ooo4 = "something else" 
    start_response('200 OK', [('content-type', 'text/html')]) 
    yield ooo 

.. 그들이 모두 다른 것들 가정 같을 것이다 무엇하거나 호출한다

functions ? 

또는 간단하게 중요하지 않습니까?

가장 빠른 코드를 만드는 방법은 무엇입니까?

+0

예, 파이썬 모듈이 캐시됩니다. WSGI를 사용하여 각 요청에 대해 새로운 파이썬 인터프리터를 다시 실행할 필요가 없다. –

+0

@Martijn Pieters,하지만 그것은 단지 모듈이 아닙니다. 캐시되고있는 파일의 내용입니다. 이 세상이나이 우주에서 이와 같은 개념을 어디에서 들었습니까? –

+0

@Martijn Pieters, "환경 라인 위에 정의 된 클래스 나 함수에 파일 경로를 제공 하시겠습니까?"라고 말하려고 했습니까? –

답변

1

파이썬 모듈의 최상위 레벨에있는 것은 모듈 가져 오기시 한 번만로드됩니다. 이것은 의도적으로 설계된 것입니다.

WSGI 서버는 프로세스 당 한 번 모듈을 가져온 다음 application 메서드를 호출하여 요청을 처리합니다. 각 요청에 대해 '신선한'데이터가 필요한 경우 은 모듈 전역을 사용하지 않습니다.

요청 당 데이터를 작성하는 방법은 전적으로 귀하에게 달려 있습니다. 함수를 사용하여 논리를 분할하고 코드를 재사용 가능하게 만드는 것은 좋은 생각입니다.

+0

이 개념이 현실이라면 식기 세척기에서 씻은 양말을 발코니로 옮기고 같은 바구니를 사용하여 같은 바구니를 가져 와서 다른 곳으로 운반하는 것과 동일할까요? –

+0

나는 볼 수 있단다. 식기 세척기에서 발코니로가는 경로가 암기되고 여기서 wsgi와 python으로 암기되고있다. 캐싱은 암기와 같다. –

+0

아니요, 파이썬 모듈은 프로그래밍 할 수있는 로봇입니다. 'application' 함수는 세척 바구니를 운반하는 서브 루틴입니다. 로봇은 호출 할 수있는 모든 종류의 절차가 필요하며 발코니에 도착하는 방법에 대한 데이터도 저장해야합니다. 당신은 세탁을 할 때마다'application' 함수를 호출하지만, 당신이 할 때마다 발코니에 들어가는 방법이나, 바구니를 보관하는 방법, 또는 바구니를 비우는 법을 로봇이 말할 필요가 없습니다 한 번 거기. –