検索
ホームページバックエンド開発Python チュートリアル同時実行パターン: アクティブ オブジェクト

Concurrency Patterns: Active Object

導入

アクティブ オブジェクト パターンは、メソッドの実行メソッドの呼び出しから切り離す同時実行設計パターンです。このパターンの主な目的は、クライアントに同期インターフェイスを提供しながら、別のスレッドで操作を実行することによって非同期動作を導入することです。これは、メッセージ パッシング、リクエスト キュー、スケジューリング メカニズムを組み合わせて使用​​して実現されます。

主要コンポーネント

  1. プロキシ: クライアントへのパブリック インターフェイスを表します。さらに簡単に言えば、これはクライアントが対話する対象です。メソッド呼び出しをアクティブなオブジェクトのリクエストに変換します。
  2. スケジューラ: リクエスト キューを管理し、リクエストの実行順序を決定します。
  3. Servant: 呼び出されるメソッドの実際の実装が含まれます。ここが実際の計算ロジックの始まりです。
  4. アクティブ化キュー: スケジューラが処理するまで、プロキシからのリクエストを保存します。
  5. Future/Callback: 非同期計算の結果のプレースホルダー。

ワークフロー

  1. クライアントはプロキシ上でメソッドを呼び出します。
  2. プロキシはリクエストを作成し、アクティベーションキューに入れます。
  3. スケジューラはリクエストを取得し、実行のためにサーバントに転送します。
  4. 結果は、future オブジェクトを介してクライアントに返されます。

使用例

  • 予測可能な実行パターンを必要とするリアルタイム システム。
  • メインスレッドの応答性を維持するための GUI アプリケーション。
  • 非同期リクエストを処理するための分散システム。

実装

API 呼び出しやデータベース クエリなどの計算を行う必要があるとします。私は怠け者なので、例外処理は実装しません。

def compute(x, y):
    time.sleep(2)  # Some time taking task
    return x + y

アクティブオブジェクトパターンなし

以下は、アクティブ オブジェクト パターンを使用せずに同時リクエストを処理する方法の例です。

import threading
import time


def main():
    # Start threads directly
    results = {}

    def worker(task_id, x, y):
        results[task_id] = compute(x, y)

    print("Submitting tasks...")
    thread1 = threading.Thread(target=worker, args=(1, 5, 10))
    thread2 = threading.Thread(target=worker, args=(2, 15, 20))

    thread1.start()
    thread2.start()

    print("Doing other work...")

    thread1.join()
    thread2.join()

    # Retrieve results
    print("Result 1:", results[1])
    print("Result 2:", results[2])


if __name__ == "__main__":
    main()

上記のアプローチの欠点

  • スレッド管理: スレッドを直接管理すると、特にタスクの数が増えるにつれて複雑さが増します。

  • 抽象化の欠如: クライアントは、タスク管理とビジネス ロジックを結び付けて、スレッドのライフサイクルを管理する責任があります。

  • スケーラビリティの問題: 適切なキューまたはスケジューリング メカニズムがなければ、タスクの実行順序を制御できません。

  • 応答性の制限: クライアントは、結果にアクセスする前にスレッドが参加するまで待つ必要があります。

Active Objectパターンを使用した実装

以下は、上記と同じことを行うためにスレッドとキューを使用したアクティブ オブジェクト パターンの Python 実装です。各部分を 1 つずつ説明します:

MethodRequest: メソッド、引数、および結果を保存する Future をカプセル化します。

def compute(x, y):
    time.sleep(2)  # Some time taking task
    return x + y

スケジューラ: 別のスレッドで activity_queue からのリクエストを継続的に処理します。

import threading
import time


def main():
    # Start threads directly
    results = {}

    def worker(task_id, x, y):
        results[task_id] = compute(x, y)

    print("Submitting tasks...")
    thread1 = threading.Thread(target=worker, args=(1, 5, 10))
    thread2 = threading.Thread(target=worker, args=(2, 15, 20))

    thread1.start()
    thread2.start()

    print("Doing other work...")

    thread1.join()
    thread2.join()

    # Retrieve results
    print("Result 1:", results[1])
    print("Result 2:", results[2])


if __name__ == "__main__":
    main()

Servant: 実際のロジック (計算メソッドなど) を実装します。

class MethodRequest:
    def __init__(self, method, args, kwargs, future):
        self.method = method
        self.args = args
        self.kwargs = kwargs
        self.future = future

    def execute(self):
        try:
            result = self.method(*self.args, **self.kwargs)
            self.future.set_result(result)
        except Exception as e:
            self.future.set_exception(e)

プロキシ: メソッド呼び出しをリクエストに変換し、結果の Future を返します。

import threading
import queue


class Scheduler(threading.Thread):
    def __init__(self):
        super().__init__()
        self.activation_queue = queue.Queue()
        self._stop_event = threading.Event()

    def enqueue(self, request):
        self.activation_queue.put(request)

    def run(self):
        while not self._stop_event.is_set():
            try:
                request = self.activation_queue.get(timeout=0.1)
                request.execute()
            except queue.Empty:
                continue

    def stop(self):
        self._stop_event.set()
        self.join()

クライアント: タスクを非同期で送信し、必要に応じて結果を取得します。

import time


class Servant:
    def compute(self, x, y):
        time.sleep(2)
        return x + y

利点

  • 分離されたインターフェイス: クライアントは実行の詳細を気にせずにメソッドを呼び出すことができます。
  • 応答性: 非同期実行により、クライアントの応答性が確保されます。
  • スケーラビリティ: 複数の同時リクエストをサポートします。

短所

  • 複雑さ: アーキテクチャの複雑さが増加します。
  • オーバーヘッド: スレッドとキューを管理するために追加のリソースが必要です。
  • レイテンシ: 非同期処理により追加のレイテンシが発生する可能性があります。

結論

アクティブ オブジェクト パターンは、マルチスレッド環境で非同期操作を管理するための強力なツールです。メソッドの呼び出しを実行から分離することで、応答性、スケーラビリティが向上し、コードベースがよりクリーンになります。ある程度の複雑さと潜在的なパフォーマンスのオーバーヘッドは伴いますが、その利点により、高い同時実行性と予測可能な実行が必要なシナリオには優れた選択肢となります。ただし、その使用は当面の特定の問題によって異なります。ほとんどのパターンやアルゴリズムと同様、万能の解決策はありません。

参考文献

ウィキペディア - アクティブ オブジェクト

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

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

pythonusesahybridmodelofcompilation andtertation:1)thepythoninterpretercompilessourcodeodeplatform-indopent bytecode.2)thepythonvirtualmachine(pvm)thenexecuteTesthisbytecode、balancingeaseoputhswithporformance。

Pythonは解釈されたものですか、それとも編集された言語であり、なぜそれが重要なのですか?Pythonは解釈されたものですか、それとも編集された言語であり、なぜそれが重要なのですか?May 12, 2025 am 12:09 AM

pythonisbothintersedand compiled.1)it'scompiledtobytecode forportabalityacrossplatforms.2)bytecodeisthenは解釈され、開発を許可します。

ループ対pythonのループの場合:説明されたキーの違いループ対pythonのループの場合:説明されたキーの違いMay 12, 2025 am 12:08 AM

loopsareideal whenyouwhenyouknumberofiterationsinadvance、foreleloopsarebetterforsituationsは、loopsaremoreedilaConditionismetを使用します

ループのために:実用的なガイドループのために:実用的なガイドMay 12, 2025 am 12:07 AM

henthenumber ofiterationsisknown advanceの場合、dopendonacondition.1)forloopsareideal foriterating over for -for -for -saredaverseversives likelistorarrays.2)whileopsaresupasiable forsaresutable forscenarioswheretheloopcontinupcontinuspificcond

Python:それは本当に解釈されていますか?神話を暴くPython:それは本当に解釈されていますか?神話を暴くMay 12, 2025 am 12:05 AM

pythonisnotpurelyLepted; itusesahybridapproachofbytecodecodecodecodecodecodedruntimerttation.1)pythoncompilessourcodeintobytecode、whodythepythonvirtualmachine(pvm).2)

同じ要素を持つPython Concatenateリスト同じ要素を持つPython ConcatenateリストMay 11, 2025 am 12:08 AM

ToconcatenateListsinpythothesheElements、使用:1)Operatortokeepduplicates、2)asettoremoveduplicates、or3)listcomplunting for controloverduplicates、各メトドハスディフェルフェルフェントパフォーマンスアンドソーダーインプリテーション。

解釈対編集言語:Pythonの場所解釈対編集言語:Pythonの場所May 11, 2025 am 12:07 AM

pythonisantertedlanguage、useaseofuseandflexibility-butfactingporformantationationsincriticalapplications.1)解釈されたlikepythonexecuteline-by-lineを解釈します

ループのために:Pythonでそれぞれを使用するのはいつですか?ループのために:Pythonでそれぞれを使用するのはいつですか?May 11, 2025 am 12:05 AM

Useforloopswhenthenumberofiterationsisknowninadvance、andwhiloopswheniterationsdependonacondition.1)forloopsareidealforsecenceslikelistoranges.2)

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール