Frank Cheng
Frank Cheng

Reputation: 6206

How to make flask response to client asynchronously?

Flask is a single thread web server. But I want to make it won't block when handle some time consuming request.

For example:

from flask import Flask
import time
import sys
app = Flask(__name__)

@app.route("/")
def hello():
    print "request"
    sys.stdout.flush()
    for _ in range(10000000):
        for j in range(10000000):
            i = 1
    return "Hello World!"

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

I want when every client request to server, it always output "request" on console immediately. I have try gunicorn and run with gunicorn -k gevent -w 4 a:app but it still appears synchronous.

Upvotes: 10

Views: 17084

Answers (2)

Miguel Grinberg
Miguel Grinberg

Reputation: 67502

I believe you are asking about something called "streaming". For Flask this can be accomplished using generator functions and the yield keyword.

Streaming is covered in more detail in the official Flask documentation, have a look here.

Upvotes: 1

Markus Unterwaditzer
Markus Unterwaditzer

Reputation: 8244

This snippet is a good starting point.

You also should look into Celery or RQ, they're the right thing to use for larger projects, more importantly they're not Flask-specific.

They also have Flask integration each, Flask-Celery and Flask-RQ.

Upvotes: 1

Related Questions