非同期エージェント
非同期エージェント (または単にエージェント) は、他のエージェントと非同期的に連動してより大きなコンピューティング タスクを解決するアプリケーション コンポーネントです。 エージェントは、ライフ サイクルが設定されたタスクと見なすことができます。 たとえば、あるエージェントが入出力デバイス (キーボード、ディスク上のファイル、ネットワーク接続など) からデータを読み取り、別のエージェントがそのデータを入手可能になった段階で処理する場合などです。 1 つ目のエージェントは、メッセージ パッシングを使用して、他のデータが入手可能であることを 2 つ目のエージェントに通知します。 同時実行ランタイム タスク スケジューラは、優先度が高くなくても、エージェントが協調的にブロックや中断ができるようにする効率的なメカニズムを提供します。
エージェント ライブラリは、非同期エージェントを表す concurrency::agent クラスを定義します。 agent
は、仮想メソッド concurrency::agent::run を宣言する抽象クラスです。 run
メソッドは、エージェントによって実行されるタスクを実行します。 run
は抽象型のため、agent
から派生させるすべてのクラスにこのメソッドを実装する必要があります。
エージェントのライフ サイクル
エージェントには、ライフ サイクルが設定されています。 concurrency::agent_status 列挙型は、エージェントのさまざまな状態を定義します。 次の図は、エージェントがある状態から別の状態に遷移する様子を示した状態図です。 この図では、実線はアプリケーションから呼び出されるメソッドを表し、点線はランタイムから呼び出されるメソッドを表します。
次の表で、agent_status
列挙型の各状態について説明します。
エージェントの状態 | 説明 |
---|---|
agent_created |
エージェントの実行がスケジュールされていません。 |
agent_runnable |
ランタイムがエージェントの実行をスケジュールしています。 |
agent_started |
エージェントが起動して動作中です。 |
agent_done |
エージェントが終了しました。 |
agent_canceled |
エージェントが started 状態に入る前にキャンセルされました。 |
agent_created
はエージェントの初期状態で、agent_runnable
と agent_started
はアクティブ状態で、agent_done
と agent_canceled
は最終状態です。
agent
オブジェクトの現在の状態を取得するには、concurrency::agent::status メソッドを使用します。 status
メソッドはコンカレンシー セーフですが、エージェントの状態は status
メソッドが戻るまでに変化する可能性があります。 たとえば、status
メソッドが呼び出されたときはエージェントが agent_started
状態であっても、status
メソッドが戻った直後は agent_done
状態に移行している可能性があります。
メソッドと機能
次の表に、agent
クラスに属している重要なメソッドの一部を示します。 すべての agent
クラス メソッドの詳細については、「エージェント クラス」を参照してください。
Method | 説明 |
---|---|
start | agent オブジェクトの実行をスケジュールし、オブジェクトを agent_runnable 状態に設定します。 |
run | agent オブジェクトによって実行されるタスクを実行します。 |
完成です | エージェントを agent_done 状態に移行させます。 |
cancel | エージェントが開始されていない場合は、このメソッドがエージェントの実行をキャンセルし、agent_canceled 状態に設定します。 |
status | agent オブジェクトの現在の状態を取得します。 |
待機 | agent オブジェクトが agent_done 状態または agent_canceled 状態になるまで待機します。 |
wait_for_all | 指定されたすべての agent オブジェクトが agent_done 状態または agent_canceled 状態になるまで待機します。 |
wait_for_one | 指定された agent オブジェクトの少なくとも 1 つが agent_done 状態または agent_canceled 状態になるまで待機します。 |
エージェント オブジェクトを作成したら、concurrency::agent::start メソッドを呼び出して、その実行をスケジュールします。 ランタイムは、エージェントをスケジュールした後に run
メソッドを呼び出し、agent_runnable
状態に設定します。
ランタイムは、非同期エージェントによってスローされた例外を管理しません。 例外処理とエージェントの詳細については、「例外処理」を参照してください。
例
基本的なエージェント ベースのアプリケーションを作成する方法を示す例については、「チュートリアル: エージェント ベースのアプリケーションの作成」を参照してください。