これは非常に自由な質問であり、謝罪します。
Await.ready
はAwaitable.type
を返しますが、Await.result
はT
を返しますが、それでも混乱しています。
2つの違いは何ですか?
1つはブロッキングで、もう1つは非ブロッキングですか?
どちらも将来が完了するまでブロックされますが、違いは戻り値の型だけです。
Future
が例外をスローする場合、違いは役に立ちます。
def a = Future { Thread.sleep(2000); 100 }
def b = Future { Thread.sleep(2000); throw new NullPointerException }
Await.ready(a, Duration.Inf) // Success(100)
Await.ready(b, Duration.Inf) // Failure(Java.lang.NullPointerException)
Await.result(a, Duration.Inf) // 100
Await.result(b, Duration.Inf) // crash with Java.lang.NullPointerException
両方とも、最大で指定されたDuration
をブロックしています。ただし、_Await.result
_はすぐに未来の結果を返そうとし、未来が失敗した場合に例外をスローしますが、_Await.ready
_は結果(Success
またはFailure
)の完了した未来を返しますvalue
プロパティを使用して安全に抽出できます。
後者もタイムアウトに対処する必要がある場合に非常に便利です。
_val future = Future { Thread.sleep(Random.nextInt(2000)); 123 }
Try(Await.ready(future, 1.second)) match {
case Success(f) => f.value.get match {
case Success(res) => // handle future success
case Failure(e) => // handle future failure
}
case Failure(_) => // handle timeout
}
_
_Await.result
_を使用すると、タイムアウト例外と失敗した先物からの例外が「混同」されます。
_Try(Await.result(future, 1.second)) match {
case Success(res) => // we can deal with the result directly
case Failure(e) => // but we might have to figure out if a timeout happened
}
_
一般的に、両方がブロックされています。
違いは、指定された時間内にFutureが(成功または失敗して)終了するまで_Await.ready
_がブロックしていることです。
唯一の違いは、ready
が準備完了になるまでAwaitable
がブロックし、result
が結果タイプT
を生成することです。
Postscriptum:実際には、エラーチェックやログ記録などのアクションを実行する場合、結果を作成し、問題が発生した場合にエラーをスローする場合はAwait.ready(...)
を使用します。 Await.result(...)
。
経験則として-Awaitを避けるようにしてください。