W mojej aplikacji stan wspólnego obiektu jest zmieniany poprzez wysyłanie żądań, a odpowiedź zależy od stanu.
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')
Jeśli uruchomię to na moim serwerze deweloperskim, spodziewam się uzyskać 1, 2, 3 i tak dalej. Jeśli wnioski są składane jednocześnie od 100 różnych klientów, czy coś może pójść nie tak? Oczekiwany wynik byłby taki, że każdy ze 100 różnych klientów zobaczyłby niepowtarzalny numer od 1 do 100. A może wydarzy się coś takiego:
- Zapytania klienta 1.
self.param
jest zwiększana o 1. - Przed wykonaniem instrukcji return wątek przełącza się na klienta 2.
self.param
jest ponownie zwiększany. - Wątek przełącza się z powrotem na klienta 1, a klientowi zwracany jest, powiedzmy, numer 2.
- Teraz wątek przechodzi do klienta 2 i zwraca mu / jej numer 3.
Ponieważ było tylko dwóch klientów, oczekiwane wyniki to 1 i 2, a nie 2 i 3. Liczba została pominięta.
Czy tak się stanie, gdy zwiększę skalę mojej aplikacji? Na jakie alternatywy dla zmiennej globalnej powinienem spojrzeć?
źródło