Готовый перевод 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
Настройки
Готово:
