如何从期货#awaitAll的结果中获得一些(x)?
问题描述:
我写了下面简单的代码来测试scala.actors._:
// java version "1.7.0_02"
// Scala code runner version 2.9.1.final
// Windows 7 Ultimate sp1 64-bit
import scala.actors._
import scala.collection.mutable.ArrayBuffer
object FutureResults extends App {
val t1 = System.currentTimeMillis
val (timeout, results) = (1000, new ArrayBuffer[Future[_]])
for (i <- 0 until 3) results += new FutureResultsActor !! "execute"
val options = Futures awaitAll (timeout, results:_*)
val t2 = System.currentTimeMillis
println("spent: %,d ms" format t2 - t1)
options foreach println
results foreach { i => println("isSet: %b" format i.isSet) }
Thread sleep timeout
val t3 = System.currentTimeMillis
println("spent: %,d ms" format t3 - t1)
options foreach println
results foreach { i => println("isSet: %b" format i.isSet) }
}
class FutureResultsActor extends Actor {
start
override def act = react { case "execute" => Futures future "done" }
}
这将产生:
spent: 1,092 ms
None
None
None
isSet: false
isSet: false
isSet: false
spent: 2,137 ms
None
None
None
isSet: false
isSet: false
isSet: false
期货Scaladoc的#awaitAll说:
The result of a future that resolved during the time span is its value wrapped in Some.
The result of a future that did not resolve during the time span is None.
是超时值太小?好吧,我将该值更改为5000毫秒,然后重试:
spent: 5,070 ms
None
None
None
isSet: false
isSet: false
isSet: false
spent: 10,093 ms
None
None
None
isSet: false
isSet: false
isSet: false
全部为无。为什么?...
如何从期货#awaitAll的结果中获得一些(x)?
有没有不正确的代码?
答
事实上,他们都超时。非常悲剧!原因是:你没有发送演员的回复,或者至少没有正确回复。我真的不知道什么是“期货未来”是,但是......我的理解是正确的方式从内部的演员是像这样回复:
class FutureResultsActor extends Actor {
start
override def act = react { case "execute" => reply("done") } // Use reply()!
}
做这让我这样的结果:
spent: 150 ms
Some(done)
Some(done)
Some(done)
isSet: true
isSet: true
isSet: true
spent: 1,165 ms
Some(done)
Some(done)
Some(done)
isSet: true
isSet: true
isSet: true
根据该文件,'Futures.future'安排执行一个给定的机构,返回代表结果的未来。你是对的,他忘了回复,但他想回报期货,所以它应该是'回复(Futures.future(“完成”))'。 – fotNelton 2012-02-16 06:54:59
@fotNelton你确定吗?他已经给这些演员留言了!运营商,它会自动返回未来,不是吗?另外,如果我这样做,Somes得到填充将“”,而不是“完成”。 –
Destin
2012-02-16 07:01:12
谢谢大家,尤其是德斯廷。回复(“完成”)令我满意。我得到一些(完成)。非常感谢。 – 2012-02-16 07:19:34