Futures and Promises / Фьючи и Промисы: Blocking

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

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

2heoh 11.11.13 в 07:43

0

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

2heoh 11.11.13 в 07:46

0

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)
}

2heoh 11.11.13 в 07:46

0

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

2heoh 11.11.13 в 07:52

0

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

2heoh 11.11.13 в 07:57

0

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

2heoh 11.11.13 в 08:00

0

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

2heoh 11.11.13 в 08:02

0

blocking {
potentiallyBlockingCall()
}

2heoh 11.11.13 в 08:02

0

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

2heoh 11.11.13 в 08:05

0
Минутку...