ホームページ >バックエンド開発 >Python チュートリアル >同時実行パターン: ボーキング パターン

同時実行パターン: ボーキング パターン

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-28 00:13:11505ブラウズ

Concurrency Patterns: Balking Pattern

はじめに

Balking Design Pattern は、システム内の状態に依存するアクションを管理するために使用される動作設計パターンです。これにより、システムが適切な状態にある場合にのみ操作が実行されることが保証されます。必要な前提条件が満たされない場合、操作は中止されるか、システムが「停止」します。ボーキングとは何かを知らない私のような人のために、グーグルはこれについて次のように述べています:「アイデアや取り組みを受け入れることをためらったり、受け入れたくないこと」。このパターンは、無効なアクションによって競合やエラーが発生する可能性があるマルチスレッド環境またはシステムで特に役立ちます。

コミュニティ内の一部の人々は、ボーキング パターンをデザイン パターンというよりもアンチパターンと見なしています。オブジェクトがその API をサポートできない場合は、問題のある呼び出しが利用できないように API を制限するか、制限なく呼び出しができるようにする必要があります。これは古いパターンで、JVM が遅く、同期が現在ほどよく理解されて実装されていなかったときに発生したと思われます。いずれにしても、議論する価値はあり、使用するかどうかは開発者次第です。

Balking パターンは 3 つの基本的な概念に依存しています

  1. ガード条件: 操作を続行するには満たさなければならない条件。
  2. 状態に依存するアクション: システムの現在の状態に依存する操作。
  3. スレッドの安全性: このパターンでは、同時環境での安全性を確保するためにロックやその他の同期メカニズムがよく使用されます。

例を挙げてこれらを理解しましょう:

印刷システムはボーキング パターンを示します:

  • シナリオ: プリンターは一度に 1 つの印刷要求のみを処理できます。複数のプロセスが印刷リクエストを発行できる場合でも。
  • ガード条件: 新しい印刷リクエストを処理するために、印刷がアクティブに「印刷」されていてはなりません。
  • 動作: プリンターがビジー状態の場合、システムは停止し、新しい印刷要求を処理しません。

注: はい、キューを使用してこれを処理できますが、今のところ、このようなエレガントなデータ構造が存在することは知らないと仮定しましょう。

import threading
import time

class Printer:
    def __init__(self):
        self.state = "idle"
        self.lock = threading.Lock()

    def start_printing(self, job_id):
        print(f"Attempting to start Print Job {job_id}...")

        with self.lock:  # Ensure thread safety
            if self.state == "printing":
                print(f"Balking: Print Job {job_id} cannot start. Printer is busy.")
                return
            self.state = "printing"

        # Simulate the printing process
        print(f"Print Job {job_id} started.")
        time.sleep(3)
        print(f"Print Job {job_id} completed.")

        with self.lock:
            self.printing = "idle"

# Multiple threads attempting to start print jobs
printer = Printer()

threads = [
    threading.Thread(target=printer.start_printing, args=(1,)),
    threading.Thread(target=printer.start_printing, args=(2,))
]

for t in threads:
    t.start()

for t in threads:
    t.join()

コードを見ると、印刷リクエスト start_printing をプリンターに送信し、プリンターがビジー状態の場合、プリンターは現在の状態 self.state をチェックし、状態が「printing」の場合は何もせずに戻ることがわかります。 。それ以外の場合は、そのリクエストを処理し、それに応じて状態を調整します。

ボーキングパターンを使用する場合

  1. マルチスレッド システム: 競合状態や無効な操作を防止します。
  2. 状態依存のワークフロー: アクションが特定の状態でのみ許可される場合。
  3. リソース管理: 共有リソースの不適切な使用を防ぐため。 このパターンを使用するオブジェクトは通常、一時的にのみボークしやすい状態にありますが、その期間は不明です。物体が既知の有限期間にわたってボークしやすい状態に留まる場合は、ガードされたサスペンション パターンが優先される可能性があります。

ボーキングパターンの利点

  1. 無効な操作の防止: ガードは、有効な条件下でのみ操作が行われることを保証します。
  2. スレッド セーフティ: マルチスレッド システムで特に役立ちます。
  3. ロジックの簡素化: 状態に依存するアクションを明確で再利用可能なパターンにカプセル化します。

デメリット

  1. 適用範囲が限定的: アクションがバイナリ (許可または不許可) の場合に最も役立ちます。
  2. 潜在的なオーバーヘッド: ガード チェックと同期メカニズムにより、パフォーマンス コストが発生する可能性があります。

結論

Balking デザイン パターンは、状態に依存するアクションを管理し、ソフトウェア システムでの無効な操作を防止する効果的な方法を提供します。明確なガード条件を導入し、スレッドの安全性を確保することで、システムの信頼性と保守性が向上します。タクシー予約システムで複数の乗車を防止する場合でも、同時印刷ジョブを管理する場合でも、Balking パターンは、競合を回避し、運用の整合性を維持するための構造化されたアプローチを提供します。最終的に、Balking パターンを使用するかどうかは、アプリケーションの特定の要件と同時実行のニーズによって決まります。

参考文献

  • ウィキペディア - 吠えるパターン
  • UCB

以上が同時実行パターン: ボーキング パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。