2012-02-16 152 views
1

全部。如何從期貨#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)?

有沒有不正確的代碼?

回答

3

事實上,他們都超時。非常悲劇!原因是:你沒有發送演員的回覆,或者至少沒有正確回覆。我真的不知道什麼是「期貨未來」是,但是......我的理解是正確的方式從內部的演員是像這樣回覆:

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 
+0

根據該文件,'Futures.future'安排執行一個給定的機構,返回代表結果的未來。你是對的,他忘了回覆,但他想回報期貨,所以它應該是'回覆(Futures.future(「完成」))'。 – fotNelton 2012-02-16 06:54:59

+1

@fotNelton你確定嗎?他已經給這些演員留言了!運營商,它會自動返回未來,不是嗎?另外,如果我這樣做,Somes得到填充將「」,而不是「完成」。 – Destin 2012-02-16 07:01:12

+0

謝謝大家,尤其是德斯廷。回覆(「完成」)令我滿意。我得到一些(完成)。非常感謝。 – 2012-02-16 07:19:34