2011-11-01 5 views
12

위 게시하기 전에 mod_wsgi 위키를 포함하여 온라인 리소스를 많이 읽었지만 Apache 프로세스/스레드가 mod_wsgi와 얼마나 상호 작용하는지 혼동합니다.아파치 + mod_wsgi 상호 작용

아파치가 하나 이상의 자식 프로세스가 들어오는 요청을 처리 할 수 ​​있도록 실행되도록 구성 할 수 있으며, 각 자식 프로세스를 구성하여 하나 이상의 스레드를 사용하여 서비스 요청을 처리하도록 구성 할 수 있습니다. 그 후, 일들이 나를 위해 흐릿 해지기 시작합니다. 내 의심은 :

  1. WSGIDaemonProcess 란 무엇이며 파이썬 하위 인터프리터를 사용하여 실제로 내 장고 앱을 호출하는 사람은 누구입니까?
  2. 단일 아파치 하위 프로세스에서 여러 스레드가 허용되는 모드에서 장고 앱을 실행하는 경우 - 여러 요청이 동시에 내 앱에 동시에 액세스 할 수 있다는 의미입니까? 그렇다면 모듈 수준의 변수 (사용자 ID)를 설정하는 것과 같은 일을하면 다른 병렬 요청에 의해 덮어 쓰여 스레드가 안전하지 않은 행동을하게 될 수 있습니다.
  3. 위의 경우 파이썬의 전역 인터프리터 잠금을 사용하면 스레드가 실제로 병렬로 실행됩니까?

답변

10

각 포인트에 대한 답변입니다.

1 - WSGIDaemonProcess/WSGIProcessGroup은 WSGI 응용 프로그램을 실행하기 위해 mod_wsgi가 별도의 프로세스를 fork해야 함을 나타냅니다. 이것은 fork/exec가 아니므로 mod_wsgi은 여전히이를 제어합니다. URL이 데몬 모드에서 실행중인 WSGI 응용 프로그램에 매핑되면 Apache 하위 작업자 프로세스의 mod_wsgi 코드가 요청 세부 정보를 데몬 모드 프로세스로 프록시 처리하여 mod_wsgi 코드가이를 읽은 다음 WSGI로 호출합니다 신청.

2 - 예, 여러 요청이 동시에 작동 할 수 있으며 모듈 전역 데이터를 동시에 수정하려고 할 수 있습니다.

3 - 글로벌 인터프리터 잠금은 한 번에 하나의 스레드 만 파이썬 코드를 실행할 수 있다는 것을 의미하므로 실행이 파이썬 자체 내에서 실행될 때까지는 엄격히 병렬로 실행되지 않습니다. 파이썬 인터프리터는 주기적으로 어떤 스레드가 실행되도록 전환 할 것입니다. 스레드 중 하나가 C 코드를 호출하고 GIL을 릴리스하면 적어도 스레드가 해당 상태에있는 동안 Python 또는 C 코드로 실행되는 다른 스레드와 병렬로 실행할 수 있습니다. 예를 들어, 응답 데이터를 다시 쓰기 위해 Apache/mod_wsgi 계층으로 호출이 내려지면 GIL이 해제됩니다. 즉, 하위 계층에서 응답 데이터를 실제로 다시 쓰는 것이 다른 스레드가 실행되는 것을 막지 못합니다.