「リアクターパターン」とそのアプリケーションの簡単な説明[クローズ]


89

Reactorパターンはウィキペディアで説明されていますが、少し抽象的すぎます。このパターンをより具体的に説明できますか?理想的には、reactorパターンのいくつかのアプリケーションを説明するコードスニペットまたは高レベルのクラス図を使用します。


3
この質問は素晴らしい答えであることがわかりました-stackoverflow.com/questions/9138294/…–
Ryan Gibbons

回答:


38

あなたはそれを説明している元の論文をチェックしたいかもしれませんhttp://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

Reactorデザインパターンは、1つ以上のクライアントによってアプリケーションに同時に配信されるサービスリクエストを処理します。アプリケーション内の各サービスは、サーバーメソッドで構成されている場合があり、サービス固有の要求のディスパッチを担当する個別のイベントハンドラーによって表されます。イベントハンドラーのディスパッチは、登録されたイベントハンドラーを管理する開始ディスパッチャーによって実行されます。サービス要求の逆多重化は、同期イベントデマルチプレクサによって実行されます。


記事を読んでお気づきのように、Douglas Schmidt et.alは、Reactorパターンが中心的な役割を果たすAdaptive CommunicationsEnvironmentと呼ばれる非常に効率的でモジュール式のC ++フレームワークを実装しました。フレームワーク自体は、多数のデザインパターンを利用しており、そのためだけに検討する価値があります。高度にスケーラブルなC ++バックエンドを構築するためのポータブルフレームワークを探しているなら、ACEは一見の価値があります。
user2015735 2018年

1
リンクが壊れている今日の男:( @reese
アラン・チュア

1
@AllanChua私はそれを見つけたと思います-dre.vanderbilt.edu/~schmidt/PDF/Reactor.pdf– manish
ma

3
... OPは「シンプル、具体的な」説明を求め、そしてあなたも、より抽象的なウィキペディアよりも何かを提供
浙江

21

リアクターを使用すると、(たとえばIOが原因で)ブロックする複数のタスクを単一のスレッドを使用して効率的に処理できます。リアクターはハンドラーのプールを管理し、イベントループを実行します。タスクを実行するために呼び出されると、タスクを新しいハンドラーまたは空のハンドラーにリンクしてアクティブにします。イベントループ(1)は、アクティブでブロックされていないすべてのハンドラーを検出します(または、これをディスパッチャー実装に委任します)(2)完了するか、ブロックするポイントに到達するまで、検出された各ハンドラーを順番に実行します。完了したハンドラーは非アクティブになり、再利用のために空になりますが、ブロックされたアクティブハンドラーは降伏し、イベントループを続行できます。(3)手順(1)から繰り返します。


1
これが正しくないため、反対票を投じてください
SebNag 2018

3
中心的なアイデアは、同期イベントの逆多重化を実行することです。イベントハンドラーは、非ブロッキング方式で実行できる場合にのみ呼び出されます。たとえば、データパケット全体がネットワークソケットで利用可能であり、イベントハンドラーがデータを処理するのを待機します。これにより、イベントハンドラーを非ブロッキング方式で順番に実行できます
SebNag 2018

2
「Reactorパターンは、ブロックせずに同期的に操作を開始できるときにトリガーされる複数のイベントハンドラーの逆多重化とディスパッチを担当します。」承認された回答にリンクされた論文から
SebNag 2018

これはまったく真実ではありません。非リアクターには、リアクターパターンと同じ数のスレッドがあります。イベントループの代わりに、オブザーバー/イベントリスナーパターンを使用しない単一の「駆動」スレッドを持つことができます。同じパフォーマンス。
ゾンビ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.