[Python] threading, local() and uwsgi: how protected is local()? - RITENTO
Alessandro Dentella
sandro a e-den.it
Mer 13 Dic 2017 09:12:46 CET
Ciao Marco,
grazie per la risposta e l'attenzione.
> > al lavoro abbiamo avuto una interessante discussione su un modo di
> > tenere in Django una informazione sempre disponibile (request / user e
> > recentemente un 'dominio').
> >
> > Una soluzione a volte considerata "da evitare" ma che ci è sempre
> > andata bene è stata fatta seguendo un vecchio snippet di Django [2 -
> inizio]
> > che immagazzina i dati in threading local().
> >
> > Quello che mi ha fatto balzare sulla sedia ieri è che un collega mi ha
> > mostrato un post [1] su StackOverflow dove si dice che uwsgi non
> > garantisce che quello che si mette in local() non sia condiviso fra
> > thread differenti... nonostante la documentazione Python dica:
> >
> > Thread-local data are data whose values are thread specific
> >
> >
> > In una pagina citata in questo post [2] si espone una situazione molto
> > simile alla mia, ma non vedo una risposta soddisfacente sul fatto che
> > sia in effetti vero
> >
> > * che uwsgi forza un uso condiviso della ram fra thread differenti e
> > * se esiste un modo per bypassarlo
> >
> > io ho spesso in uwsgi.ini (ma ho anche occasionalmente di più):
> >
> > threads: 1
> > processors: 2
> >
> > È questo che mi ha salvato fino ad oggi?
> >
> >
> > sandro
> > *:-)
> >
> >
> > PS: tecnicamente io scrivo nel _thread_local tramite middleware ad
> > ogni request, non esiste possibilità che resti il vecchio nella
> > nuova request
>
>
> Ciao Alessandro,
>
> incuriosito dalla tua domanda e partaggiando il tuo stesso stupore ho
> fatto qualche ricerca.
>
> Prima di tutto vorrei iniziare dicendo che faccio piu' confidenza al
> gruppo di unbit piuttosto che al commento di qualcuno in un sito. Mi
> sembrava di aver letto nella documentazione di uWSGI che l'obiettivo
> principale di uWSGI sia la correttezza, le performance vengono dopo.
> Ovviamente non ritrovo la frase in questione ma che cambino la semantica
> di threading.local per ragioni di performance mi sembra un suicidio. Se
> fai un veloce grep nel codice di Django ti accorgerai che Django stesso
> usa local() internamente.
>
> Per scrupolo ho fatto una piccola ricerca nei sorgenti di uWSGI e non
> trovo conferma di una simile castroneria.
>
> Sono gia' bloccato, non so' piu' come continuare. Sono stati portati
> esempi concreti a supporto della tesi? No.
>
> Allego due file di test e come puoi verificare e threading.local
> funziona esattamente come ci si aspetterebbe.
Avendo sollecitato Roberto De Ioris anche in privato, mi ha in effetti
risposto:
Ciao, di solito si usano i thread local per avere dati
NON-condivisi tra i thread. Se e' il tuo caso, allora puoi usarli
senza problemi a patto che abiliti il GIL in uWSGI con
--enable-threads.
Va da sè che se non abilito --enable-threads, problema non ne ho,
visto che non uso threads... e --threads imploca --enable-threads.
> In realta' e' l'altro risultato che mi lascia dei dubbi, quando
> threading.local non e' usato.
Qui ti ho perso... quale sarebbe "l'altro risultato"?
sandro
*:-)
Maggiori informazioni sulla lista
Python