目次 トップ スケジューラ リモートアクター 目次

リモートアクター

この節ではリモートアクター 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 が終了するまで待たなくてはいけない。この規制は全ポートに渡り、BA と別のポートで登録するだけでは不十分だ。

リモートアクターへの接続

リモートアクターへの接続も簡単だ。マシーン 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 のインスタンスを作成するからだ。


2010年11月30日

目次 トップ スケジューラ リモートアクター 目次