2014-09-17 18 views
5

Sto leggendo la documentazione Flask e ho letto questo -Cosa significa Thread Local Objects in Flask?

Una delle decisioni di progettazione nel pallone era che semplici compiti dovrebbero essere semplici; non dovrebbero prendere molto codice e tuttavia non dovrebbero limitarti. Per questo motivo, Flask ha poche scelte progettuali che alcune persone potrebbero trovare sorprendenti o non ortodosse. Ad esempio, Flask utilizza internamente gli oggetti thread-local in modo che non sia necessario passare oggetti dalla funzione alla funzione all'interno di una richiesta per rimanere protetti da thread. Questo approccio è conveniente, ma richiede un contesto di richiesta valido per l'iniezione di dipendenza o quando si tenta di riutilizzare il codice che utilizza un valore ancorato alla richiesta. Il progetto Flask è onesto sui thread-locals, non li nasconde e chiama nel codice e nella documentazione dove sono usati.

Cosa significa? In particolare le seguenti domande -

  • Che cosa sono gli oggetti locali del thread? Come e quando vengono utilizzati e quale scopo risolvono?
  • In che modo l'utilizzo di oggetti thread-local internamente garantisce la sicurezza dei thread e in che modo il passaggio degli oggetti alla funzione risulta in non-thread-safe?
  • Qual è il significato di un contesto di richiesta valido in questo caso?

risposta

14

Un oggetto locale del thread è un oggetto archiviato in una struttura dedicata, legata all'ID del thread corrente. Se si chiede questa struttura per l'oggetto, verrà utilizzato l'identificatore di thread corrente per fornire dati univoci per il thread corrente. Vedi threading.local. È possibile ottenere ulteriori dettagli immettendo import _threading_local; help(_threading_local) nell'interprete interattivo Python.

Questo significa che ogni volta che si utilizza current_app, g o requests si ottiene una struttura di dati che è sicuro da usare nel tuo thread, senza dover preoccuparsi di blocco e altri problemi di concorrenza.

Nel normale funzionamento, Flask gestisce le richieste WSGI in entrata; per ciascuna di tali richieste viene creato un contesto di richiesta per te; questo è rappresentato dagli oggetti g e request. Se si sta tentando di utilizzare una delle proprie viste senza una richiesta in entrata (ad esempio nei test), l'oggetto request non funzionerà e si lamenterà che non esiste un contesto di richiesta valido. Flask ti fornisce gli strumenti per produrre un tale contesto su richiesta in quel caso. Vedere lo Faking Resources and Context documentation, nonché il capitolo Request Context.