web-dev-qa-db-ja.com

Await.readyとAwait.resultの違い

これは非常に自由な質問であり、謝罪します。

Await.readyAwaitable.typeを返しますが、Await.resultTを返しますが、それでも混乱しています。

2つの違いは何ですか?

1つはブロッキングで、もう1つは非ブロッキングですか?

24
octavian

どちらも将来が完了するまでブロックされますが、違いは戻り値の型だけです。

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
31
soote

両方とも、最大で指定された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
}
_
2
lex82

一般的に、両方がブロックされています。

違いは、指定された時間内にFutureが(成功または失敗して)終了するまで_Await.ready_がブロックしていることです。

唯一の違いは、readyが準備完了になるまでAwaitableがブロックし、resultが結果タイプTを生成することです。

Postscriptum:実際には、エラーチェックやログ記録などのアクションを実行する場合、結果を作成し、問題が発生した場合にエラーをスローする場合はAwait.ready(...)を使用します。 Await.result(...)

経験則として-Awaitを避けるようにしてください。

2