KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

flaskの引数にてapp.run(debug=True, threaded=True) をしなかった場合はThreadingは有効ではありませんか?

登録日 :2024/02/13 04:40
カテゴリ :python django

Flaskアプリケーションを実行する際に、app.run()メソッドにthreaded=Trueを渡すと、Flaskはマルチスレッドモードで実行されます。これにより、複数のクライアントからのリクエストを同時に処理できるようになります。つまり、マルチスレッドモードが有効になると、複数のリクエストが同時に処理されるため、スレッドセーフな処理が必要になります。

デフォルトでは、Flaskはシングルスレッドモードで実行されます。つまり、リクエストごとに新しいスレッドが生成されるのではなく、一つのスレッドがシーケンシャルにリクエストを処理します。そのため、threaded=Trueを指定しない場合、マルチスレッドモードは無効になり、シングルスレッドモードで動作します。

したがって、app.run(debug=True, threaded=True)を指定しない場合、マルチスレッドモードは有効になりません。そのため、同時に複数のリクエストを処理すると、一つのリクエストが終了するまで次のリクエストが待機することになります。

FlaskのThreadingを活用したサンプル

from flask import Flask, jsonify
import threading
import time

app = Flask(__name__)

# 関数:外部APIからデータを取得する
def get_data_from_external_api():
    # ここで外部APIからデータを取得する処理を実行
    time.sleep(5)  # 仮の待機処理
    return {'message': 'Data from external API'}

# 関数:ローカルデータベースからデータを取得する
def get_data_from_local_database():
    # ここでローカルデータベースからデータを取得する処理を実行
    time.sleep(3)  # 仮の待機処理
    return {'message': 'Data from local database'}

# Flaskルート:外部APIからのデータ取得
@app.route('/api/external')
def get_external_data():
    # スレッドを作成して外部APIからデータを取得する関数を実行
    t = threading.Thread(target=get_data_from_external_api)
    t.start()
    return jsonify({'message': 'Getting data from external API'})

# Flaskルート:ローカルデータベースからのデータ取得
@app.route('/api/local')
def get_local_data():
    # スレッドを作成してローカルデータベースからデータを取得する関数を実行
    t = threading.Thread(target=get_data_from_local_database)
    t.start()
    return jsonify({'message': 'Getting data from local database'})

if __name__ == '__main__':
    # Flaskアプリケーションを実行し、マルチスレッドサポートを有効にする
    app.run(debug=True, threaded=True)