非同期エージェント

非同期エージェント (または単にエージェント) は、他のエージェントと非同期的に連動してより大きなコンピューティング タスクを解決するアプリケーション コンポーネントです。 エージェントは、ライフ サイクルが設定されたタスクと見なすことができます。 たとえば、あるエージェントが入出力デバイス (キーボード、ディスク上のファイル、ネットワーク接続など) からデータを読み取り、別のエージェントがそのデータを入手可能になった段階で処理する場合などです。 1 つ目のエージェントは、メッセージ パッシングを使用して、他のデータが入手可能であることを 2 つ目のエージェントに通知します。 同時実行ランタイム タスク スケジューラは、優先度が高くなくても、エージェントが協調的にブロックや中断ができるようにする効率的なメカニズムを提供します。

エージェント ライブラリは、非同期エージェントを表す concurrency::agent クラスを定義します。 agent は、仮想メソッド concurrency::agent::run を宣言する抽象クラスです。 run メソッドは、エージェントによって実行されるタスクを実行します。 run は抽象型のため、agent から派生させるすべてのクラスにこのメソッドを実装する必要があります。

エージェントのライフ サイクル

エージェントには、ライフ サイクルが設定されています。 concurrency::agent_status 列挙型は、エージェントのさまざまな状態を定義します。 次の図は、エージェントがある状態から別の状態に遷移する様子を示した状態図です。 この図では、実線はアプリケーションから呼び出されるメソッドを表し、点線はランタイムから呼び出されるメソッドを表します。

Agent State Diagram.

次の表で、agent_status 列挙型の各状態について説明します。

エージェントの状態 説明
agent_created エージェントの実行がスケジュールされていません。
agent_runnable ランタイムがエージェントの実行をスケジュールしています。
agent_started エージェントが起動して動作中です。
agent_done エージェントが終了しました。
agent_canceled エージェントが started 状態に入る前にキャンセルされました。

agent_created はエージェントの初期状態で、agent_runnableagent_started はアクティブ状態で、agent_doneagent_canceled は最終状態です。

agent オブジェクトの現在の状態を取得するには、concurrency::agent::status メソッドを使用します。 status メソッドはコンカレンシー セーフですが、エージェントの状態は status メソッドが戻るまでに変化する可能性があります。 たとえば、status メソッドが呼び出されたときはエージェントが agent_started 状態であっても、status メソッドが戻った直後は agent_done 状態に移行している可能性があります。

メソッドと機能

次の表に、agent クラスに属している重要なメソッドの一部を示します。 すべての agent クラス メソッドの詳細については、「エージェント クラス」を参照してください。

メソッド 説明
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 状態に設定します。

ランタイムは、非同期エージェントによってスローされた例外を管理しません。 例外処理とエージェントの詳細については、「例外処理」を参照してください。

基本的なエージェント ベースのアプリケーションを作成する方法を示す例については、「チュートリアル: エージェント ベースのアプリケーションの作成」を参照してください。

関連項目

非同期エージェント ライブラリ