在Flask(WSGI)中使用全局单例,我需要担心竞态条件吗?

25

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对象缓存这样的东西,该怎么办?

2个回答

5
您可以尝试使用werkzeug中的Local类。 这里是一些相关信息:上下文本地变量 示例:
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()

-1
你可以看一下从 Flask 直接导入的 g 对象,它会为该请求全局保留一个对象。如果你正在使用事件驱动的 WSGI 服务器(如 tornado、gevent 等),那么你不应该遇到任何问题。

7
我认为 g 对象只在请求期间保留状态,因此对于上述用例没有用处。 - Sergey Orshanskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接