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 回答