世界您好演示了瓶是:
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对象缓存?
你可以使用锁:
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()
你可以尝试从WERKZEUG本地类。 下面是一些关于它的信息: 上下文当地人
例:
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()
你可能需要看看g
的对象,可从瓶中直接导入,保持了全球对象为该请求。 如果您使用的是事件驱动的WSGI服务器(龙卷风,GEVENT等),你不应该有任何问题。
文章来源: Working with a global singleton in Flask (WSGI), do I have to worry about race conditions?