2011-09-03 2 views
4

일반적인 응용 프로그램 (예 : Windows)에서는 개체/변수가 전역 수준에서 만들어지면 프로그램이 실행되는 전체 기간 동안 전체 프로그램에서 사용할 수 있습니다.파이썬에서 아파치/modwsgi 애플리케이션을위한 메모리 모델은 무엇입니까?

예를 들어 PHP로 작성된 웹 응용 프로그램에서는 모든 변수/객체가 스크립트 끝에서 삭제되므로 모든 것이 데이터베이스에 기록되어야합니다.

a) 그럼 apache/modwsgi에서 실행되는 Python은 어떻습니까? 그 기억은 어떻게 작동합니까?

b) 웹 페이지 요청간에 유지되는 객체를 어떻게 만들고 apache/modwsgi에서 스레드 문제가 발생하지 않도록 할 수 있습니까?

답변

0

모듈을 가져올 때 모든 파이썬 전역이 만들어집니다. 모듈을 다시 가져 오면 동일한 전역 변수가 사용됩니다.

파이썬 웹 서버는 스레딩을하지 않고 사전 처리 된 프로세스를 수행합니다. 따라서 Apache에는 스레딩 문제가 없습니다.

아파치에서 파이썬 프로세스의 수명주기는 다릅니다. 아파치는 얼마나 많은 자식 프로세스가 생성되고, 유지되고 죽었는지를 설정합니다. 즉, 파이썬 프로세스에서 전역을 사용하여 캐싱 (in-process cache)을 사용할 수 있지만 모든 요청 후에 프로세스가 종료 될 수 있으므로 영구 데이터를 전역에 넣을 수 없습니다. 그러나 프로세스가 반드시 종료 될 필요는 없으며 이와 관련하여 파이썬은 PHP보다 훨씬 효율적입니다 (소스 코드는 모든 요청에 ​​대해 구문 분석되지 않지만 개발 중에 소스 코드 변경 사항을 읽으려면 서버를 다시로드 모드로 설정해야합니다) .

전역은 프로세스 단위이며 N 개의 프로세스가있을 수 있으므로 프로세스는 memcached와 같은 메커니즘을 사용하여 "웹 서버 전역"상태를 공유합니다.

보통 파이썬 전역은 프로세스 초기화

  • 캐시 된 데이터 (중립 세션/사용자) 중에 설정

    • 설정 변수를 포함

  • +0

    제가 미리 설치했거나 스레드 된 모드가 아파치 설치 및 구성에 달려 있다고 생각하거나 다른 것을 언급하고 있습니까? – confusionz

    +0

    PRe-forked는 Python에서 선호되는 방법입니다. 스레드 설치를 할 수는 있지만 파이썬은 스레드를 좋아하지 않습니다. 긴 답변 : http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreterlock/ –

    +1

    파이썬 웹 응용 프로그램 용 스레드를 사용하는 것이 좋습니다. 대부분의 경우 응용 프로그램이 I/O를 기다리는 데 막혀있어 GIL이 사람들이 쓴 문제가 아닙니다. GIL은 높은 CPU를 필요로하는 작업에 더 큰 해를 끼칩니다. http://blog.dscpl.com.au/2007/09/parallel-python-discussion-and-modwsgi.html 및 http://blog.dscpl.com.au/2007/07/web-hosting-을 읽어보십시오. landscape-and-modwsgi.html –

    관련 문제