在瓶(WSGI)全球单工作,做我担心竞争条件?(Working with a global sing

2019-07-29 00:36发布

世界您好演示了瓶是:

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对象缓存?

Answer 1:

你可以使用锁:

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()


Answer 2:

你可以尝试从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()


Answer 3:

你可能需要看看g的对象,可从瓶中直接导入,保持了全球对象为该请求。 如果您使用的是事件驱动的WSGI服务器(龙卷风,GEVENT等),你不应该有任何问题。



文章来源: Working with a global singleton in Flask (WSGI), do I have to worry about race conditions?