在 Scala 2.8 中,当我启动 actor 时,我可以通过消息传递进行通信。这反过来意味着我可以发送最终的 Exit() 消息或任何我认为适合我的协议的消息。
但是我如何检查演员是否退出呢?我可以很容易地想象自己有一个任务,其中主演员启动一些工作演员,然后只是等待答案,每次检查这是否是最终答案(即是否有任何演员仍在工作或它们都退出了?)。
当然我可以让他们都发回一条“我完成了”的消息,然后对他们进行计数,但这在某种程度上并不令人满意。
测试工作参与者完成度时的最佳实践是什么?
EDIT#1
我正在研究期货,但遇到了麻烦。有人可以解释为什么这段代码不起作用:
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())
}
如果我在 future-body 中定义函数 fib ,它就会起作用。这一定是一个范围的事情,但我没有收到上面的任何错误,它只是挂起。任何人?
EDIT#2
看来扩展应用程序并不是一个好方法。定义一个主要方法使一切正常。下面的代码是我正在寻找的,所以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())
}
}
就我个人而言,我很喜欢“我已经完成了”的信息。这是管理工作分配的好方法,而且作为奖励,您已经知道所有孩子何时完成了他们正在做的事情。
但如果你真的只是想外包一些工作once等到一切准备就绪后,检查一下scala.actors.Futures
。你可以要求它做一些计算:
val futureA = Futures.future {
val a = veryExpensiveOperation
(a,"I'm from the future!")
}
如果您提出了多个请求,那么您可以等待一切完成:
Futures.awaitAll(600*1000, futureA, futureB, futureC, futureD)
// Returns once all of A-D have been computed
val actualA = futureA() // Now we get the value
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)