Как получить Some (x) из результатов Futures # awaitAll? - PullRequest
1 голос
/ 16 февраля 2012

все.

Я написал следующий простой код для тестирования 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 of Futures # 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

Все - Никто. Почему? ...

Как получить Some (x) из результатов Futures # awaitAll?

Есть ли неправильный код?

1 Ответ

3 голосов
/ 16 февраля 2012

В самом деле, все они истекают.Совершенно трагедия!Причина: вы не отправляете ответ от актера или, по крайней мере, неправильно.Я не совсем уверен, что такое «будущее фьючерсов», но ... я понимаю, что правильный способ ответить изнутри актера таков:

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
...