Scala 2.8 では、アクターを起動すると、メッセージ パッシングを介して通信できます。これは、最終的な Exit() メッセージ、または自分のプロトコルに合うと判断したものを送信できることを意味します。
しかし、アクターが終了したかどうかを確認するにはどうすればよいでしょうか? マスター アクターがいくつかのワーカー アクターを開始し、それが最終的な回答であるかどうか (つまり、アクターがまだ動作しているか、またはすべて終了したか) を確認するたびに、単純に回答を待つというタスクを自分が持っていることは容易に想像できます。
もちろん、「完了しました」というメッセージを全員に送り返してからカウントすることもできますが、これではどうにもなりません。
worker-actor の完了をテストする際のベスト プラクティスは何ですか?
編集#1
Futures を検討していますが、問題があります。誰かがこのコードが機能しない理由を説明できますか:
package test
import scala.actors.Futures._
object FibFut extends Application{
def fib(i:Int):Int =
if(i<2)
1
else
fib(i-1)+fib(i-2)
val f = future{ fib(3) }
println(f())
}
関数 fib を future-body 内で定義すると機能します。それはスコープの問題であるに違いありませんが、上記でエラーは発生せず、単にハングします。誰?
編集#2
Application を拡張するのは良い方法ではなかったようです。main メソッドを定義すると、すべてが機能しました。以下のコードは私が探していたものなので、Futuresは高く評価します :)
package test
import scala.actors.Futures._
object FibFut {
def fib(i: Int): Int = if (i < 2) 1 else fib(i - 1) + fib(i - 2)
def main(args: Array[String]) {
val fibs = for (i <- 0 to 50) yield future { fib(i) }
for (future <- fibs) println(future())
}
}