Sto provando a scrivere un'estensione per muffa che deve mantenere alcune informazioni tra le richieste. Funziona bene quando eseguo Werkzeug con un singolo processo, ma quando corro con più processi ottengo qualche comportamento strano che non capisco. Prendete questa semplice applicazione come esempio:Werkzeug e stato della classe con Flask: come vengono ripristinate le variabili dei membri della classe quando la classe non viene reinizializzata?
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)
Per i primi due scenari si comporta esattamente come ci si aspetta: l'oggetto contatore viene inizializzato una volta e poi incrementa con ogni richiesta per il '/' percorso. Quando eseguo con il terzo scenario (processi di passaggio = 2), allora ottengo questo come output:
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 -
Sembra che counter.value sta tornando al suo stato giusto dopo essere stato inizializzato senza essere re-inizializzato. Qualcuno potrebbe far luce su ciò che Werkzeug sta facendo internamente per fare in modo che ciò accada? Sarei anche molto interessato a imparare se c'è un modo per farlo comportarsi come mi aspetterei ingenuamente (due processi, ciascuno con la propria istanza di Counter). Grazie!
hai trovato una soluzione a questo? Qualche dettaglio di implementazione? – user1658296