Ich versuche, eine Kolbenerweiterung zu schreiben, die einige Informationen zwischen Anforderungen erhalten muss. Das funktioniert gut, wenn ich Werkzeug mit einem einzigen Prozess leite, aber wenn ich mit mehreren Prozessen laufe, bekomme ich seltsames Verhalten, das ich nicht verstehe. Nehmen Sie diese einfache Anwendung als Beispiel:Werkzeug und Klassenzustand mit Flask: Wie werden Klassengliedvariablen zurückgesetzt, wenn die Klasse nicht reinitialisiert wird?
from flask import Flask
app = Flask(__name__)
class Counter(object):
def __init__(self, app):
print('initializing a Counter object')
self.app = app
self.value = 0
def increment(self):
self.value += 1
print('Just incremented, current value is ', self.value)
counter = Counter(app)
@app.route('/')
def index():
for i in range(4):
counter.increment()
return 'index'
if __name__ == '__main__':
#scenario 1 - single process
#app.run()
#scenario 2 - threaded
#app.run(threaded=True)
#scenario 3 - two processes
app.run(processes=2)
Für die ersten beiden Szenarien verhält es sich genau so, wie ich erwarten würde: das Counter-Objekt wird einmal initialisiert und dann erhöht er mit jeder Anfrage an die ‚/‘ Route. Wenn ich es mit dem dritten Szenario laufen (vorbei Prozesse = 2), dann bekomme ich diese als Ausgabe:
initializing a Counter object
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Just incremented, current value is 1
Just incremented, current value is 2
Just incremented, current value is 3
Just incremented, current value is 4
127.0.0.1 - - [30/Aug/2015 09:47:25] "GET/HTTP/1.1" 200 -
Just incremented, current value is 1
Just incremented, current value is 2
Just incremented, current value is 3
Just incremented, current value is 4
127.0.0.1 - - [30/Aug/2015 09:47:26] "GET/HTTP/1.1" 200 -
Just incremented, current value is 1
Just incremented, current value is 2
Just incremented, current value is 3
Just incremented, current value is 4
127.0.0.1 - - [30/Aug/2015 09:47:27] "GET/HTTP/1.1" 200 -
Es scheint, dass counter.value Rückkehr wird es nach Zustand ist richtig, ohne tatsächlich neu initialisiert wird initialisiert. Könnte jemand etwas Licht auf das werfen, was Werkzeug intern tut, um dies zu ermöglichen? Ich wäre auch sehr daran interessiert zu lernen, ob es einen Weg gibt, dieses Verhalten so zu gestalten, wie ich es naiv erwarten würde (zwei Prozesse, jeder mit einer eigenen Instanz von Counter). Vielen Dank!
Haben Sie eine Lösung gefunden? Irgendwelche Implementierungsdetails? – user1658296