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

Buttons840 picture Buttons840 · Apr 16, 2012 · Viewed 16.1k times · Source

The hello world demo for Flask is:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

What if I modified this like so:

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

I understand WSGI application might have multiple threads. The hello function could be running on multiple threads at the same time, and then we'd have a race condition. Is this correct? If the above code is not thread safe, what can I do to make it thread safe?

Avoiding globals is a possible solution, but can you always avoid globals? What if I want something like a python object cache?

Answer

Florentin picture Florentin · Sep 16, 2015

You could try the Local class from werkzeug. Here's some info about it: Context Locals

Example:

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