質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2788閲覧

非同期処理・並行処理のコードでのマルチスレッドの動きを確認したい。

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/10/09 17:07

編集2022/01/12 10:55

この質問と関連します。

下記のような実装の場合、非同期で実行されてはいるものの何回か連続でエンドポイントに対してリクエストを飛ばしたときに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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

もっともよく使われているPython処理系(Cpython)では、グローバルインタプリタロック(GIL)といって、同時には一つのスレッドしか動作しないという仕様になっています。

理由については公式ドキュメント グローバルインタプリタロック (Global Interpreter Lock) を取り除くことはできないのですか?に書かれていますのでお読みください。

投稿2021/10/09 21:35

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2021/10/10 02:30

コメントありがとうございます。 GILはそうなんですが、fastapiの場合、リクエスト跨ぎでどんどん非同期で処理が実行されていくのでノンブロッキングでGIL関係なくマルチスレッド並行になってるんじゃないかな?という質問でした。 ようは、なぜfastapiのほうが早いのか、なぜflaskが遅いのかを調べようとしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問