[Python] threading, local() and uwsgi: how protected is local()? - RITENTO
Alessandro Dentella
sandro a e-den.it
Gio 7 Dic 2017 18:39:14 CET
***********
Rimando nella speranza che qualcuno legga e desideri e magari stia
cercando di combattere la noia...
***********
Ciao,
[disclaimer: si parla di Django ma il tema mi pare più generale poi si
parla di uwsgi e mi pare che Roberto qui legga...]
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
[1] https://stackoverflow.com/questions/3227180/why-is-using-thread-locals-in-django-bad
[2] https://www.pythonanywhere.com/forums/topic/710/
Maggiori informazioni sulla lista
Python