2012-02-16 4 views
1

Futures#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" } 
} 

これが生成する:先物#awaitAllの

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は言う:

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の結果からいくつか(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( "done")) '。 – fotNelton

+1

@fotNeltonそれは本当ですか?彼はすでに俳優にメッセージを送った!!演算子は自動的に未来を返しますが、そうではありませんか?また、私がそれをすると、「完了」よりもむしろ「」が満たされます。 – Destin

+0

ありがとう、特にデスティン。返信( "済")は私を満足させます。私はいくつかの(完了)sを取得します。どうもありがとう。 –

関連する問題