24

Flask の Hello World デモは次のとおりです。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

これを次のように変更するとどうなりますか。

from flask import Flask
app = Flask(__name__)

a = 1
b = 2
c = 3

@app.route("/")
def hello():
    a += 1
    b += a
    c += b
    return "Hello World!"

if __name__ == "__main__":
    app.run()

WSGI アプリケーションには複数のスレッドがある可能性があることを理解しています。hello関数が複数のスレッドで同時に実行される可能性があり、競合状態が発生します。これは正しいです?上記のコードがスレッド セーフでない場合、スレッド セーフにするにはどうすればよいですか?

グローバルを回避することは可能な解決策ですが、常にグローバルを回避できますか? Python オブジェクト キャッシュのようなものが必要な場合はどうすればよいですか?

4

2 に答える 2

5

werkzeug の Local クラスを試すことができます。それについての情報は次のとおりです: Context Locals

例:

from flask import Flask
from werkzeug.local import Local
app = Flask(__name__)
loc = Local()
loc.a = 1
loc.b = 2
loc.c = 3

@app.route("/")
def hello():
    loc.a += 1
    loc.b += loc.a
    loc.c += loc.b
    return "Hello World!"

if __name__ == "__main__":
    app.run()
于 2015-09-16T08:36:26.270 に答える
0

gフラスコから直接インポートできるオブジェクトを見て、そのリクエストに対してオブジェクトをグローバルに保持することができます。イベント駆動型のWSGIサーバー(tornado、geventなど)を使用している場合は、問題は発生しないはずです。

于 2012-04-17T09:58:22.313 に答える