リモートアクター | 目次 |
この節ではリモートアクター API の説明をする。主なインターフェイスは、scala.actors.remote
パッケージの RemoteActor オブジェクトだ。このオブジェクトはリモートアクターのインスタンスを作成し接続するためのメソッドを提供する。今後のコード例では、RemoteActor
の全てのメンバーがインポート済みであることを前提とする。以下に用いられているインポートを示す:
import scala.actors._ import scala.actors.Actor._ import scala.actors.remote._ import scala.actors.remote.RemoteActor._
リモートアクターはシンボル (Symbol) によって一意的に識別される。このシンボルはリモートアクターが実行されている JVM のインスタンス独自のものだ。'myActor
という名前で識別されるリモートアクターの作成を以下に示す。
class MyActor extends Actor { def act() { alive(9000) register('myActor, self) // ... } }
アクターの名前を登録できるのは、(存命中の)一人のアクターまでであることに注意してほしい。例えば、アクター A を 'myActor
として登録した後で、別のアクター B も 'myActor
登録しようとすると、まず A が終了するまで待たなくてはいけない。この規制は全ポートに渡り、B を A と別のポートで登録するだけでは不十分だ。
リモートアクターへの接続も簡単だ。マシーン myMachine
のポート 8000
で 'anActor
という名前で実行中のリモートアクターへのリモート参照を取得するには、以下のように select
を用いる:
val myRemoteActor = select(Node("myMachine", 8000), 'anActor)
select
が返すアクターは AbstractActor
型であり、基本的には普通のアクターを同じインターフェイスを持つため、通常のメッセージ通信演算をサポートする:
myRemoteActor ! "おはよう!" receive { case response => println("応答: " + response) } myRemoteActor !? "人生の意味は何?" match { case 42 => println("成功") case oops => println("失敗: " + oops) } val future = myRemoteActor !! "円周率の最後の桁の数は何?"
ここで注意してほしいのは、select
は遅延評価されるためネットワーク接続を始動しないということだ。これは select
が、(例えば、!
の呼び出しなど)必要に応じてネットワーク接続を始動できる状態の新しい AbstractActor
のインスタンスを作成するからだ。
リモートアクター | 目次 |