Готовый перевод Futures and Promises / Фьючи и Промисы: Blocking

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

Как уже было отмечено ранее, блокировки на фьючах строго не рекомендуются ради производительности и для предотвращения дед-локов. Более предпочтительный способ - использовать коллбеки и комбинаторы. Однако, блокировки могут быть необходимы в определенных ситуациях и предоставляются в Futures and Promises API.

Ниже в предоставленном примере обмена валют, есть место блокировки, в конце приложения для того чтобы убедиться что все фьючи были завершены. Вот пример как блокироваться на результате фьючи:

import scala.concurrent._
import scala.concurrent.duration._
def main(args: Array[String]) {
val rateQuote = future {
connection.getCurrentValue(USD)
}
val purchase = rateQuote map { quote =>
if (isProfitable(quote)) connection.buy(amount, quote)
else throw new Exception("not profitable")
}
Await.result(purchase, 0 nanos)
}

В случае когда фьюча фейлится, в вызывающий код перенаправляется исключение, с которым зафейлилась фьюча. Это включает ошибочное _projection–blocking_ на результах в виде вызванного исключения NoSuchElementException если начальная фьюча завершилась успехом.

При вызове Await.ready происходит блокировка, до тех пока фьюча не станет завершена, но без получения её результата. В то же время вызов этого метода не выбросит исключение, если в результате выполнения возникнет ошибка.

Трейт Future реализует трейт Awaitable с методами ready() и result(). Эти методы не могут быть вызваны клиентами напрямую, они могут вызваны только контекстом выполнения.

Позволяя клиентам вызвать сторонний код, который потенциально может быть блокирующимся и для того чтобы не реализовывать трейт Awaitable те же блокирующие примитивы могут быть использованы следующим способом:

blocking {
potentiallyBlockingCall()
}

Блокирующийся код также может вызывать исключения. В этом случае исключение будет перепослано в вызывающий код.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/44566/176068

Переводчики: 2heoh

Настройки

Готово:

100.00% КП = 1.0