Python 3.3.5 + Flaskでサーバアプリを作っています。

内容

FlaskにHTTPリクエストを送ると即座にレスポンスを返してくれますが、

  • 2つ以上のリクエストを同時に送る

もしくは

  • 早かった方のリクエストの処理中に続けてリクエストを送る

といった事をすると、遅かった方のリクエストのレスポンスは早かった方へのレスポンスが完了するまで待たされます。

単一スレッドで処理しているだからだと思われますが、これをFlaskで並列処理できる方法はありませんでしょうか。

テストに使ったコード

if __name__ == '__main__':
    app = Flask(__name__)
    app.config.update(PROPAGATE_EXCEPTIONS = True)

    @app.route('/')
    def greet():
        n = randrange(1, 10)
        sleep(n)
        return 'Hello world! I slept {0}[s].'.format(str(n))

    app.run()

これは、リクエストが飛んできたら乱数を元に1 - 10秒待ち何秒待ったか返すコードです。

ブラウザのタブを2つ用意し、両方素早くlocalhost:5000へアクセスすると、先にアクセスした方にレスポンスが返ってきてから後の方の待つフェーズが始まることが待ち時間からわかります。

もしFlaskが並列でレスポンスを返すことができたら、待ち時間の乱数が小さかったほうが先に返ってくるはずです。