この質問と関連します。
下記のような実装の場合、非同期で実行されてはいるものの何回か連続でエンドポイントに対してリクエストを飛ばしたときに1リクエスト1threadを順々に実行していってしまいます。
FastAPIで同じコードを実行した場合は、リクエスト跨ぎでマルチスレッドで処理がどんどん実行されていき、Flaskよりも早くおわります。
これは、つまり、Flaskでは非同期ではあるものの、マルチスレッドで並行処理はされていないということなのでしょうか?wsgi準拠であるためできない、っていう理解であってますでしょうか?
どういう差分があって何がおきているのかがきになっているので、スレッドの動きの確認ができる方法もしくは、何がおきているのか、ご存知のかたいましたらご教示いただけませんでしょうか?
Flaskによる実装
python
1from flask import Blueprint, Flask 2import asyncio 3 4app = Flask(__name__) 5 6api = Blueprint("app", __name__) 7 8 9async def async_get_data(name, sec): 10 print(f"start {name}") 11 await asyncio.sleep(sec) 12 print(f"end {name}") 13 return f"{name}/{sec}" 14 15 16@api.route("/data1") 17async def get_data1(): 18 results = await asyncio.gather( 19 async_get_data("A", 2), 20 async_get_data("B", 1), 21 async_get_data("C", 3), 22 async_get_data("D", 1), 23 async_get_data("E", 4) 24 ) 25 print(results) 26 return "data1 SUCCESS!" 27 28app.register_blueprint(api)
アウトプット
python
1start A 2start B 3start C 4start D 5start E 6end B 7end D 8end A 9end C 10end E 11['A/2', 'B/1', 'C/3', 'D/1', 'E/4'] 12start A 13start B 14start C 15start D 16start E 17end B 18end D 19end A 20end C 21end E 22['A/2', 'B/1', 'C/3', 'D/1', 'E/4'] 23start A 24start B 25start C 26start D 27start E 28end B 29end D 30end A 31end C 32end E 33['A/2', 'B/1', 'C/3', 'D/1', 'E/4']
追記
FastAPIに標準でついているbackgroundtaskが差分になりそうだが、いまいち仕組みにについて理解できていない。
https://qiita.com/uezo/items/8225e33dfe0e342d0271
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/10 02:30