6

リクエスト間でいくつかの情報を保持する必要があるフラスコ拡張機能を作成しようとしています。Werkzeug を 1 つのプロセスで実行すると問題なく動作しますが、複数のプロセスで実行すると、理解できない奇妙な動作が発生します。例として、次の単純なアプリケーションを取り上げます。

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)

最初の 2 つのシナリオでは、予想どおりに動作します。Counter オブジェクトは一度初期化され、「/」ルートへのリクエストごとにインクリメントされます。3 番目のシナリオ (プロセス = 2 を渡す) で実行すると、次の出力が得られます。

 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 -

実際に再初期化されることなく、初期化された直後に counter.value がその状態に戻っているようです。これを実現するために Werkzeug が社内で行っていることを誰かが明らかにしてくれませんか? また、単純に期待するようにこれを動作させる方法があるかどうかを知ることにも非常に興味があります (2 つのプロセス、それぞれに Counter のインスタンスがあります)。ありがとう!

4

1 に答える 1