2011-11-01 16 views
12

Przed opublikowaniem tego artykułu, przeczytałem sporo zasobów w Internecie, w tym na wiki o nazwie mod_wsgi, ale nie wiem, jak dokładnie procesy/wątki Apache wchodzą w interakcje z mod_wsgi.Apache + mod_wsgi interakcja

To jest mój obecny sposób rozumienia: Apache można skonfigurować tak, aby działał w taki sposób, aby co najmniej jeden proces potomny mógł obsłużyć przychodzące żądania, a każdy z tych procesów potomnych można skonfigurować tak, aby z kolei używał jednego lub więcej wątków do obsługi zgłoszeń serwisowych. Potem sprawy zaczynają się mętnieć. Moje wątpliwości to:

  1. Co to jest WSGIDaemonProcess i kto faktycznie wywołuje moją aplikację Django za pomocą interpretera Pythona?
  2. Jeśli mam moją aplikację Django działającą w trybie, w którym wiele wątków jest dozwolonych w pojedynczym procesie Apache - czy to oznacza, że ​​wiele żądań może jednocześnie uzyskać dostęp do mojej aplikacji? Jeśli tak - czy zrobienie czegoś takiego jak ustawienie zmiennej poziomu modułu (powiedzmy, że identyfikator użytkownika) może zostać nadpisane przez inne żądania równoległe i prowadzić do zachowania niezwiązanego z wątkami?
  3. Dla powyższego przypadku, przy globalnej blokadzie interpretera Pythona, czy wątki rzeczywiście będą wykonywane równolegle?

Odpowiedz

10

Odpowiedzi do każdego z punktów.

1 - WSGIDaemonProcess/WSGIPocessGroup wskazuje, że mod_wsgi powinien rozwidlić osobny proces do uruchomienia aplikacji WSGI. Jest to tylko fork, a nie fork/exec, więc mod_wsgi nadal je kontroluje. Po wykryciu, że adres URL jest mapowany do aplikacji WSGI działającej w trybie demona, wówczas kod mod_wsgi w procesach potomnych Apache przeprojektuje szczegóły żądania do trybu demona, gdzie odczytuje go kod mod_wsgi i wywołuje WSGI podanie.

2 - Tak, wiele żądań może działać jednocześnie i chce modyfikować dane globalne modułu w tym samym czasie.

3 - Dla czasu, w którym wykonanie jest w obrębie samego Python, nie, nie są one ściśle wykonywane równolegle, ponieważ globalna blokada interpretera oznacza, że ​​tylko jeden wątek może wykonywać kod Pythona na raz. Interpreter Pythona okresowo zmienia, który wątek jest uruchamiany. Jeśli jeden z wątków wywołuje kod C i zwalnia GIL, to przynajmniej na czas, gdy wątek jest w tym stanie, może działać równolegle do innych wątków, działając w Pythonie lub w kodzie C. Przykładowo, gdy wywoływane są wywołania do warstwy Apache/mod_wsgi w celu zapisania danych odpowiedzi, GIL jest zwalniany. Oznacza to, że faktyczne zapisywanie danych odpowiedzi w niższych warstwach nie zapobiega uruchamianiu innych wątków.