![]() |
![]() |
![]() |
リモートアクター | 目次 |
この節ではリモートアクター 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 のインスタンスを作成するからだ。
![]() |
![]() |
![]() |
リモートアクター | 目次 |