может ли кто-нибудь сказать, каково точное использование await.result(метод, duartion.inf) в проектах scala?

#scala #asynchronous

Вопрос:

wait.result(метод, длительность.inf) почему мы используем это? Есть ли для этого какая-либо альтернативная функция? В каком случае мы используем это в основном? Я видел это в проекте, но я не понял, что это такое и почему мы это используем. Я искал это в Google, но не получил четкого ответа на свой вопрос.

Комментарии:

1.Scaladoc и проверка типов значений могут очень помочь. — В любом случае, TL;DR; — это то, что method вернуло a Future (что представляет собой асинхронное вычисление), а затем они Await.result ждали его завершения (снова делая его синхронным) и получали результирующее значение. — В общем, вам не следовало бы этого делать, а скорее сочинять Future , используя такие методы, как map amp; flatMap , но, возможно, там были веские причины для ожидания результата

Ответ №1:

Развивая комментарий Луиса, Await.result(???, Duration.Inf) блокирует до тех пор, пока будущее не завершится без тайм-аута. Эта блокировка создает риск нехватки потоков (если все потоки в ExecutionContext (или эквивалентной абстракции в пуле потоков) заблокированы, никакие задачи (включая те, которые будут выполняться в будущем) не могут выполняться) и, как правило, следует избегать.

Везде, где это возможно, продолжайте вычисления в асинхронном мире, используя map / flatMap и друзей (или, в крайнем случае, используя обратные вызовы).

Иногда, однако, бывают случаи, когда вам приходится переходить из асинхронного мира в синхронный, причем основным примером является реализация синхронного API (предположительно, того, над которым вы не имеете никакого контроля) внутренне асинхронным способом:

 trait SynchronousAPI {
  // Being synchronous, the implicit contract is "block caller's thread until there's an Int to return"
  def someMethod(x: String): Int
}

class AsynchronousImplementation(implicit val ec: ExecutionContext) extends SynchronousAPI {
  def asyncSomeMethod(x: String): Future[Int] = ???

  def someMethod(x: String): Int =
    // Satisfying the synchronous contract of the API
    Await.result(asyncSomeMethod(x), Duration.Inf)
}