Actor の勉強

Scala の Actor を勉強している途中で出てきた疑問等。

Actor インスタンスの作成方法

PDFのチュートリアルでは、Actor を継承したクラスを作成し、act メソッドを実装すると説明されていますが、ほとんどの場合は actor 関数を使用します嘘です。作り方次第です。

import scala.actor._
import scala.actor.Actor._

val foo = actor { loop { react { case ... } } }

actor 関数は Actor オブジェクトの関数として定義されています。
actor 関数では、引数に渡されたブロックを act の実装とした Actor インスタンスを生成しています。
後、生成した Actor インスタンスの start も呼び出しているっぽいです。

'hello とかの「'」

Actor とは関係ないのですが、Actor に送信するメッセージとして使用しているのを良く見かけるのでメモ。
「'hello」 は Symbol("hello").intern と同じらしいです。詳しくは、ScalaReference.pdf の 1.3.7 章。

!, !?, !!

メッセージを送信する関数みたいです。
以下、foo という Actor に hello というシンボルを送信する例です。

foo ! 'hello

「!?」は送信だけでなく、Actor から返信が帰ってくるのを待つみたいです。
「!!」はよくわからない。引数に PartialFunction があることと、型が Future なところから、ブロックすることなく返信を扱うことが出来るのかもしれないです。

?

receive と同じ?メッセージを受信する関数だと思う。

loop

ループ処理しているだけっぽい。
receive とか react とか使って、繰り返しメッセージを受信し続けるときに使用する・・・ともう。
ちなみに react では、無駄にスレッドを消費しないようにするためか、内部で例外を使用してループから脱出してるぽい。

receive

メッセージを受信します。
メッセージが無い場合は、メッセージが来るまでブロックする・・・んだとおもう。
受信したメッセージは、引数に渡した PartialFunction で処理する。この PartialFunction の戻り値型は Unit では無いことを考えると、receive は同期呼び出しを意図していると思われる。

react

こっちもメッセージを受信する関数です。
receive と同じように、受信したメッセージを PartialFunction で処理するんですが戻り値型が Unit です。
メッセージが無い場合に例外を投げてループから脱出することや、戻り値型が Unit というところからも、react は非同期呼び出しを意図しているんだと思う。

メッセージをベースとした仕組みで、同期呼び出し/非同期呼び出しって発想もちょとずれているかも知れないですけど(汗

link

謎です。これから調べます。

reply

返信だとおもうけど、react でも使える??

scala.actor.remote

リモート通信でのアクターモデル
TCP を使用して通信できる。これは便利そう。