In meiner App wird der Status eines gemeinsamen Objekts durch Anfragen geändert, und die Antwort hängt vom Status ab.
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')
Wenn ich dies auf meinem Entwicklungsserver ausführe, erwarte ich 1, 2, 3 und so weiter. Kann etwas schief gehen, wenn Anfragen von 100 verschiedenen Clients gleichzeitig gestellt werden? Das erwartete Ergebnis wäre, dass die 100 verschiedenen Clients jeweils eine eindeutige Zahl von 1 bis 100 sehen. Oder wird so etwas passieren:
- Client 1-Abfragen.
self.param
wird um 1 erhöht. - Bevor die return-Anweisung ausgeführt werden kann, wechselt der Thread zu Client 2.
self.param
wird erneut inkrementiert. - Der Thread wechselt zurück zu Client 1, und dem Client wird beispielsweise die Nummer 2 zurückgegeben.
- Jetzt bewegt sich der Thread zu Client 2 und gibt ihm die Nummer 3 zurück.
Da es nur zwei Kunden gab, waren die erwarteten Ergebnisse 1 und 2, nicht 2 und 3. Eine Nummer wurde übersprungen.
Wird dies tatsächlich passieren, wenn ich meine Bewerbung vergrößere? Welche Alternativen zu einer globalen Variablen sollte ich prüfen?
quelle