Nella mia app lo stato di un oggetto comune viene modificato facendo richieste e la risposta dipende dallo stato.Le variabili globali sono thread safe in beuta?
class SomeObj():
def __init__(self, param):
self.param = param
def query(self):
self.param += 1
return self.param
global_obj = SomeObj(0)
@app.route('/')
def home():
flash(global_obj.query())
render_template('index.html')
Se si esegue questo sul mio server di sviluppo, mi aspetto di ottenere 1, 2, 3 e così via. Se le richieste vengono fatte da 100 diversi clienti contemporaneamente, qualcosa può andare storto? Il risultato atteso è che i 100 diversi clienti ciascuno vedono un numero unico da 1 a 100. O sarà qualcosa di simile accada:
- client 1 query.
self.param
viene incrementato di 1. - Prima che l'istruzione di reso possa essere eseguita, il thread passa al client 2.
self.param
viene nuovamente incrementato. - Il thread torna al client 1 e il client restituisce il numero 2, ad esempio.
- Ora il filo si sposta al client 2 e restituisce lui/lei il numero 3.
Dato che c'erano solo due clienti, i risultati attesi sono stati 1 e 2, non 2 e 3. è stato saltato un numero.
Questo accadrà realmente mentre aumento la richiesta? Quali alternative a una variabile globale dovrei guardare?
Questo non sembra rispondere alla domanda. Inoltre, non funzionerà più in sicurezza quando viene rilasciato Flask 1.0, che passa automaticamente ai thread di abilitazione. Non farlo. Utilizzare un db SQLite se è necessario qualcosa di leggero e disponibile localmente. – davidism
@davidism ringraziamenti Mi sbagliavo sulla limitazione di sqlite3. Inoltre ho preso in considerazione l'idea di togliere completamente la mia risposta. Come dici tu, non risponde affatto all'OP. Tuttavia, dopo un po 'di googling questa è stata l'informazione più pertinente e utile che ho trovato quindi ho pensato che questo potesse aiutare qualcuno ad un certo punto. Poiché StackOverflow è diventato la fonte n. 1 di * tutte * le risposte di programmazione, le domande devono essere interpretate in termini della query di google che attiene qui piuttosto che la formulazione effettiva dell'OP! – paddyg
Una risposta a "sono variabili globali thread safe" che inizia con "un meccanismo non thread safe" non è esplicitamente una risposta alla domanda, e non è di grande aiuto. Se vuoi rispondere autonomamente a una domanda su come utilizzare SQLite o una singola applicazione con thread su un Raspberry Pi, fallo, non metterla in una domanda non correlata. – davidism