#scala #asynchronous
Вопрос:
wait.result(метод, длительность.inf) почему мы используем это? Есть ли для этого какая-либо альтернативная функция? В каком случае мы используем это в основном? Я видел это в проекте, но я не понял, что это такое и почему мы это используем. Я искал это в Google, но не получил четкого ответа на свой вопрос.
Комментарии:
1.Scaladoc и проверка типов значений могут очень помочь. — В любом случае, TL;DR; — это то, что
method
вернуло aFuture
(что представляет собой асинхронное вычисление), а затем они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)
}