【问题标题】:How to get Some(x) from the results of Futures#awaitAll?如何从 Futures#awaitAll 的结果中获取 Some(x)?
【发布时间】:2012-02-16 14:31:37
【问题描述】:

全部。

我写了以下简单的代码来测试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

Futures#awaitAll 的 Scaladoc 说:

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

一切皆无。为什么?...

如何从 Futures#awaitAll 的结果中获取 Some(x)?

有什么不正确的代码吗?

【问题讨论】:

    标签: scala actor


    【解决方案1】:

    确实,它们都在超时。真是悲剧!原因是:你没有从演员那里发送回复——或者至少不是正确的。我不太确定“Futures future”是什么,但是……我的理解是,从演员内部回复的正确方式是这样的:

    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 安排执行给定的主体,返回代表结果的未来。你说得对,他忘了回复,但是他想返回期货,所以应该是reply(Futures.future("done"))。
    • @fotNelton 你确定吗?他已经用 !!运算符,它会自动返回一个未来,不是吗?另外,如果我这样做,填充的 Somes 将“”,而不是“done”。
    • 谢谢大家,尤其是德斯廷。回复(“完成”)让我满意。我得到了一些(完成)。非常感谢。
    • @Destin:我的错,没有足够重视Some的输出。确实是&lt;function0&gt;。
    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2013-05-14
    • 2013-02-09
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多