2011-11-01 13 views
12

Prima di pubblicare questo, ho letto un bel po 'di risorse online, incluso il wiki mod_wsgi, ma sono confuso su come esattamente i processi/thread di Apache interagiscano con mod_wsgi.interazione Apache + mod_wsgi

Questa è la mia attuale comprensione: Apache può essere configurato per l'esecuzione in modo tale che uno o più processi figlio possano gestire le richieste in arrivo e ciascuno di questi processi figlio può essere configurato per utilizzare uno o più thread per le richieste di servizio. Dopo ciò, le cose cominciano a diventare confuse per me. I miei dubbi sono:

  1. Cos'è un WSGIDaemonProcess e chi chiama effettivamente la mia app Django utilizzando l'interprete sub Python?
  2. Se la mia app Django è in esecuzione in una modalità in cui sono consentiti più thread in un singolo processo figlio Apache, ciò significa che più richieste potrebbero contemporaneamente accedere alla mia app nello stesso momento? In tal caso, fare qualcosa di simile all'impostazione di una variabile a livello di modulo (ad esempio quella di un ID utente) potrebbe essere sovrascritta da altre richieste parallele e portare a comportamenti non thread-safe?
  3. Per il caso precedente, con il blocco dell'interprete globale di Python, i thread verrebbero effettivamente eseguiti in parallelo?

risposta

10

Risposte a ciascuno dei punti.

1 - WSGIDaemonProcess/WSGIProcrocGroup indica che mod_wsgi deve fork di un processo separato per l'esecuzione dell'applicazione WSGI in. Questa è solo una fork e non una fork/exec, quindi mod_wsgi ne ha ancora il controllo. Quando viene rilevato che un URL si associa a un'applicazione WSGI in esecuzione in modalità daemon, il codice mod_wsgi nei processi figlio secondario di Apache inoltrerà i dettagli della richiesta al processo in modalità daemon dove il codice mod_wsgi lo legge e chiama nel WSGI applicazione.

2 - Sì, possono essere attive più richieste contemporaneamente e si desidera modificare i dati globali del modulo contemporaneamente.

3 - Per il tempo in cui l'esecuzione è all'interno di Python, quindi no, non sono strettamente in esecuzione in parallelo poiché il blocco dell'interprete globale significa che solo un thread può eseguire codice Python alla volta. L'interprete Python periodicamente cambia il thread che sta per essere eseguito. Se uno dei thread chiama nel codice C e rilascia GIL, almeno per il tempo in cui quel thread si trova in quello stato, può essere eseguito in parallelo ad altri thread, in esecuzione in Python o C code. Ad esempio, quando le chiamate vengono eseguite nel livello Apache/mod_wsgi per scrivere i dati di risposta, GIL viene rilasciato. Ciò significa che la scrittura effettiva dei dati di risposta nei livelli inferiori non impedisce l'esecuzione di altri thread.

Problemi correlati