Stiamo rendendo la nostra prima applicazione Django sotto mod_wsgi comedjango + mod_wsgi richiede una disciplina di programmazione con thread?
`WSGIDaemonProcess our-appname processes=6 threads=15'`
e stiamo avendo una discussione su se il nostro codice Python e le librerie Redis e Postgres che utilizza necessità di essere thread-safe o meno.
Da quello che posso dire dalla lettura della documentazione mod_wsgi, anche se il lavoratore apache sta elaborando le richieste con più apache le discussioni, il nostro codice python è per tutti gli effetti single-threaded. Non vedo alcun avviso sui documenti mod_wsgi che dicono "Attenzione! Ora devi preoccuparti dei dati globali e della sicurezza dei thread!" ma non c'è anche alcun esplicito "Non preoccuparti dei thread non ce ne sono".
Non stiamo facendo nulla in modo esplicito con i thread nel nostro codice Python, non c'è alcun riferimento a ciò che abbiamo scritto.
Ma alcune persone qui sono dell'opinione che dal momento che stiamo correndo con threads=15
che siamo ora nel mondo multi-threaded.
Qualcuno può chiarire cosa sta succedendo? Il nostro codice Python ora è soggetto a più thread di esecuzione attraverso gli stessi dati in cui non era prima, o no?
Scusate, ma trovo molto confusa la frase che la precede. L'interprete Python stesso è thread-safe, se non lo fosse, si bloccherebbe dappertutto. Lo stato interno dell'interprete Python e la gestione dei conteggi di riferimento sono mediati da GIL come dici tu ed è ciò che garantisce che sia sicuro utilizzare l'interprete Python con più thread. Così cattivo modo di spiegarlo. Anche gunicorn con gevent non ha più thread. Quando si utilizza gevent sono tecnicamente coroutine non thread, anche se li fa apparire come thread. –
Ora il problema del codice a livello di applicazione che è thread-safe è un problema diverso, ma non confondere questo se l'interprete Python è thread-safe. –
Sul primo conteggio, suppongo sia vero, anche se non sono sicuro che sia meno preciso descrivere l'interprete python come non thread-safe per le operazioni di memoria sugli oggetti python nello stesso momento piuttosto che spiegare che è thread-safe perché il GIL impedisce ai thread di fare quanto sopra. Al secondo conteggio, sono d'accordo; gevent usa "fili verdi" che tecnicamente non sono thread - avrei dovuto spiegarlo. –