非同期エージェント
非同期エージェントは、他のエージェントと非同期的にやり取りしてより大きなコンピューティング タスクを解決するアプリケーション コンポーネントです。単に "エージェント" と呼ばれることもあります。 エージェントは一定のライフ サイクルを持ったタスクと考えることができます。 たとえば、あるエージェントが入力/出力デバイス (キーボード、ディスク上のファイル、ネットワーク接続など) からデータを読み取り、そのデータが利用できる状態になったら別のエージェントがそのデータに対して処理を実行します。 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 クラスのすべてのメソッドの詳細については、「agent クラス」を参照してください。
メソッド |
説明 |
---|---|
agent オブジェクトの実行をスケジュールし、agent_runnable 状態に設定します。 |
|
agent オブジェクトが遂行することになっているタスクを実行します。 |
|
エージェントを agent_done 状態に移行させます。 |
|
エージェントが開始されていなかった場合、このメソッドは、エージェントの実行を取り消して、agent_canceled 状態に設定します。 |
|
agent オブジェクトの現在の状態を取得します。 |
|
agent オブジェクトが agent_done 状態または agent_canceled 状態になるまで待機します。 |
|
指定されたすべての agent オブジェクトが agent_done 状態または agent_canceled 状態になるまで待機します。 |
|
指定された agent オブジェクトが少なくとも 1 つ agent_done 状態または agent_canceled 状態になるまで待機します。 |
エージェント オブジェクトを作成した後で、Concurrency::agent::start メソッドを呼び出し、実行をスケジュールします。 エージェントのスケジュール後、ランタイムが run メソッドを呼び出し、その状態を agent_runnable に設定します。
ランタイムは非同期エージェントによってスローされた例外を管理しません。 例外処理とエージェントの詳細については、「同時実行ランタイムでの例外処理」を参照してください。
例
基本的なエージェント ベースのアプリケーションを作成する方法の例については、「チュートリアル: エージェント ベースのアプリケーションの作成」を参照してください。