Nella modalità daemon non è previsto il riavvio graduale quando viene toccato il file di script WSGI per forzare un download. Cioè, a differenza di Apache stesso, che avvierà nuovi processi figlio del server Apache mentre attende che i vecchi processi finiscano con le richieste correnti, per i processi dememon di mod_wsgi, il processo esistente deve uscire prima dell'avvio di uno nuovo.
Le conseguenze di ciò sono che mod_wsgi non può attendere indefinitamente per il completamento delle richieste correnti. Se così fosse, c'è il rischio che, se tutti i processi daemon siano bloccati in attesa che le richieste correnti finiscano, i client vedrebbero un notevole ritardo nella gestione.
All'altra estremità della scala, tuttavia, il processo daemon non può essere immediatamente eliminato poiché ciò causerebbe l'interruzione delle richieste correnti.
Quindi esiste una via di mezzo. Il processo daemon attenderà il completamento delle richieste prima di uscire, ma se non sono state completate entro il periodo di spegnimento, il processo demone verrà chiuso forzatamente e le richieste attive verranno interrotte.
Il periodo di questo timeout di spegnimento è impostato su 5 secondi. Può essere sovrascritto usando l'opzione shutdown-timeout per la direttiva WSGIDaemonProcess, ma si dovrebbe tenere in debita considerazione gli effetti della sua modifica.
Pertanto, in relazione a questo problema specifico, se le richieste a esecuzione prolungata sono ancora attive quando arriva la prima richiesta dopo aver toccato il file di script WSGI, c'è il rischio che le richieste lunghe attive vengano interrotte.
La prossima cosa notevole che si può vedere è che, anche se non ci sono richieste e processi di arresto prolungati, è necessario caricare nuovamente l'applicazione WSGI all'interno del nuovo processo. Il tempo impiegato da questa operazione verrà considerato come un ritardo nella gestione della richiesta. Quanto grande sarà questo ritardo dipenderà dal framework e dalla tua applicazione. Il peggior offensore per quanto riguarda il tempo necessario per l'avvio che conosco è TurboGears. Django in qualche modo migliore e il migliore per quanto riguarda i tempi di avvio rapidi essendo micro framework leggeri come Flask.
Si noti che eventuali nuove richieste che arrivano mentre si verificano questi arresti e ritardi di avvio non vanno persi. Questo perché il socket del listener HTTP ha una certa profondità e le connessioni si accodano in attesa di essere accettate. Se il numero di richieste in arrivo è enorme e la coda si riempie, inizierai a vedere errori di connessione rifiutati nel browser.
Queste informazioni di sottofondo extra sono ottime. Avevo solo pensato a nuove richieste, non a richieste precedenti a lungo termine, ma quello che descrivi ha perfettamente senso. Grazie. – AndrewF
FWIW, mod_wsgi 4.0 inizierà a introdurre alcune opzioni di ricarica un po 'più eleganti quando è disponibile. –