web-dev-qa-db-fra.com

Différence Await.ready et Await.result

Je sais que c'est une question assez ouverte et je m'en excuse.

Je peux voir ça Await.ready résultats Awaitable.type tandis que Await.result renvoie T mais je les confond toujours.

Quelle est la différence entre les deux?

L'un est-il bloquant et l'autre non-bloquant?

24
octavian

Ils bloquent tous les deux jusqu'à ce que l'avenir se termine, la différence est juste leur type de retour.

La différence est utile lorsque votre Future lève des exceptions:

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

Les deux bloquent au plus le Duration donné. Toutefois, Await.result essaie de renvoyer le résultat futur immédiatement et lève une exception si le futur a échoué pendant que Await.ready renvoie le futur terminé à partir duquel le résultat (Success ou Failure) peut être extrait en toute sécurité via la propriété value.

Ce dernier est très pratique lorsque vous devez également gérer un délai d'attente:

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
}

Lors de l'utilisation de Await.result, l'exception de délai d'expiration et les exceptions de contrats à terme défaillants sont "mélangées".

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

En général, les deux bloquent.

La différence est que Await.ready Bloque jusqu'à ce que le futur soit terminé (réussi ou échoué) dans le temps imparti.

La seule différence est que ready bloque jusqu'à ce que Awaitable soit prêt et que result donne le type de résultat T.

Postscriptum: Dans la pratique, si vous souhaitez effectuer certaines actions comme la vérification des erreurs ou la journalisation, vous devez prendre Await.ready(...) si vous voulez composer le résultat et lancer une erreur si quelque chose ne va pas. Await.result(...).

En règle générale, essayez d'éviter l'attente.

2
λ Allquantor λ