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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top