ホームページ > バックエンド開発 > Python チュートリアル > Flask のグローバル変数はスレッドセーフですか?

Flask のグローバル変数はスレッドセーフですか?

Mary-Kate Olsen
リリース: 2025-01-01 05:10:11
オリジナル
578 人が閲覧しました

Are Flask's Global Variables Thread-Safe?

Flask ではグローバル変数はスレッドセーフですか?

Flask アプリケーションでは、同時リクエストを処理するときにデータの一貫性を維持することが重要です。グローバル変数を使用して共有データを保存すると、スレッドの安全性の問題が発生する可能性があります。

グローバル変数の安全でない使用

次の例を考えてみましょう:

class SomeObj():
    def __init__(self, param):
        self.param = param
    def query(self):
        self.param += 1
        return self.param

global_obj = SomeObj(0)

@app.route('/')
def home():
    flash(global_obj.query())
    render_template('index.html')
ログイン後にコピー

複数のクライアントがこのルートを同時に要求した場合、期待される結果は各クライアントに固有の番号 (例: 1、2、 3...)。ただし、スレッド インターリーブにより、次の競合状態が発生する可能性があります。

  1. クライアント 1 が query() を呼び出し、param を 1 に増分します。
  2. クライアント 1 のリクエストがまだ進行中である間、スレッドはクライアント 2 に切り替わります。
  3. クライアント 2 は query() を呼び出し、param を次のように増加します。 2.
  4. スレッドはクライアント 1 に戻り、予期された 1 ではなく 2 を返します。
  5. クライアント 2 は、数値 2 をスキップして 3 を返します。

グローバル変数の代替

スレッドセーフを回避するため問題がある場合は、次の代替案を検討してください:

  • 外部データ ソース: データベース、memcached、または Redis を使用して、Flask の外部にグローバル データを保存します。
  • Multiprocessing.Manager: Python データを操作する場合、multiprocessing.Manager を使用してデータを共有します。プロセス。
  • セッション オブジェクト: リクエスト間で保持する必要があるユーザー固有のデータには、Flask のセッション オブジェクトを使用します。

その他の考慮事項

  • 開発サーバーを実行している場合、次の理由によりスレッド セーフティの問題が明らかではない場合があります。シングルスレッドの性質があります。
  • gevent などの非同期 WSGI サーバーは、グローバル変数のスレッド セーフを保証しません。
  • リクエスト固有のデータ ストレージについては、Flask の g オブジェクトの使用を検討してください。

以上がFlask のグローバル変数はスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート