2012-04-16 12 views
13

フラスコのhello世界のデモは、次のとおりです。私はそうのようにこれを変更した場合は何Flask(WSGI)でグローバルシングルトンを使用すると、競合状態を心配する必要がありますか?

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のオブジェクトキャッシュのようなものを望むなら?あなたがロックを使用することができ

答えて

6

from threading import Lock 
from flask import Flask 
app = Flask(__name__) 

a = 1 
b = 2 
c = 3 
lock = Lock() 

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

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

あなたの例(カットと正確に貼り付け)の割り当ての前に参照されているので、私のために500を返します。 – jeremyjjbrown

+0

これは実際には記載された質問には答えません。ロックする必要はありますか?どのような条件の下で? GILのない通訳のためだけですか? – Basic

0

あなたがフラスコから直接インポートすることができgオブジェクトを見てかかることがあり、その要求に対してグローバルオブジェクトを保持します。イベントドリブンWSGIサーバー(竜巻、geventなど)を使用している場合は、何も問題はありません。

+4

私は 'g'オブジェクトがリクエスト中に状態を保持していると思っていたので、上記のユースケースには役に立たなかったのです。 – osa

2

werkzeugからローカルクラスを試すことができます。 はここでそれについていくつかの情報です: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()