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 对象缓存之类的东西怎么办?
您可以尝试 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()
您可以查看可以直接从 Flask 导入的
g
对象,它为该请求全局保留一个对象。如果您使用的是事件驱动的 WSGI 服务器(tornado、gevent 等),那么您应该不会遇到任何问题。