Python 与一个全球单例烧瓶(WSGI)合作,我需要担心种族条件吗?

Python 与一个全球单例烧瓶(WSGI)合作,我需要担心种族条件吗?,python,thread-safety,wsgi,flask,race-condition,Python,Thread Safety,Wsgi,Flask,Race Condition,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

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对象缓存之类的东西怎么办?

您可以查看可以直接从flask导入的
g
对象,为该请求全局保留一个对象。如果您使用的是事件驱动的WSGI服务器(tornado、gevent等),则不应出现任何问题。

您可以尝试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
对象只是在请求期间保持状态,因此对上述用例没有用处。