Sono Python variabili globali thread-safe?
Domanda
Modifica: im chiedendo se le variabili globali sono al sicuro in un framework web single-threaded come tornado
im utilizzando l'orm mongoengine, che ottiene una connessione al database da una variabile globale:
_get_db() # gets the db connection
im utilizzando anche tornado, un framework python web single-threaded. in una vista particolare, ho bisogno di afferrare una connessione al database e dereference un oggetto DBRef
[simile ad una chiave esterna]:
# dereference a DBRef
_get_db().dereference(some_db_ref)
in quanto la connessione restituito da _get_db
è una var globale, c'è una possibilità di collisione e il valore errato viene restituito al thread sbagliato?
Soluzione
Supponendo MongoEngine è avvolgente PyMongo (e credo che sia), allora si dovrebbe andare bene. PyMongo è completamente thread-safe.
Altri suggerimenti
Filati sono sempre necessari per contenere il GIL quando interagisce con oggetti Python. Lo spazio dei nomi tenendo le variabili è un oggetto Python (un frameobject o un dizionario, a seconda del tipo di variabile che è.) E 'sempre sicuro di ottenere o impostare le variabili in più thread. Lei non potrà mai ottenere i dati della spazzatura.
Tuttavia, le condizioni di gara usuali si applicano su quale oggetto si ottiene o quale oggetto si sostituisce quando si assegnano. Una dichiarazione come x += 1
è non thread-safe, perché un thread diverso può essere eseguito tra il get e il negozio, la modifica del valore di x
, che si sarebbe poi sovrascrivere.
No, ma le serrature sono piuttosto semplici da utilizzare in pitone. Utilizzare la prova: finalmente:. Modello per garantire che un blocco viene rilasciato dopo aver modificato la variabile globale
Non c'è niente di variabili globali che li rende più o meno thread-safe rispetto a qualsiasi altra variabile. O se non è possibile per un'operazione di fallire o di restituire risultati non corretti quando si esegue in diversi thread, la migliore pratica è che si dovrebbe proteggere i dati condivisi tra i thread.
Se ti sto leggendo bene, si sta chiedendo se una variabile è sicuro in un ambiente single-threaded. In questo caso, in cui i dati è non condivisa tra processi concorrenti, la variabile è al sicuro (dopo tutto, non c'è niente altro in esecuzione che possono interromperlo).