Futures and Promises / Фьючи и Промисы: Blocking
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Как уже было отмечено ранее, блокировки на фьючах строго не рекомендуются ради производительности и для предотвращения дед-локов. Более предпочтительный способ - использовать коллбеки и комбинаторы. Однако, блокировки могут быть необходимы в определенных ситуациях и предоставляются в Futures and Promises API. 2heoh 11.11.13 в 07:43 |
|
|
Ниже в предоставленном примере обмена валют, есть место блокировки, в конце приложения для того чтобы убедиться что все фьючи были завершены. Вот пример как блокироваться на результате фьючи: 2heoh 11.11.13 в 07:46 |
||
|
import scala.concurrent._ 2heoh 11.11.13 в 07:46 |
||
|
В случае когда фьюча фейлится, в вызывающий код перенаправляется исключение, с которым зафейлилась фьюча. Это включает ошибочное _projection–blocking_ на результах в виде вызванного исключения NoSuchElementException если начальная фьюча завершилась успехом. 2heoh 11.11.13 в 07:52 |
||
|
При вызове Await.ready происходит блокировка, до тех пока фьюча не станет завершена, но без получения её результата. В то же время вызов этого метода не выбросит исключение, если в результате выполнения возникнет ошибка. 2heoh 11.11.13 в 07:57 |
||
|
Трейт Future реализует трейт Awaitable с методами ready() и result(). Эти методы не могут быть вызваны клиентами напрямую, они могут вызваны только контекстом выполнения. 2heoh 11.11.13 в 08:00 |
||
|
Позволяя клиентам вызвать сторонний код, который потенциально может быть блокирующимся и для того чтобы не реализовывать трейт Awaitable те же блокирующие примитивы могут быть использованы следующим способом: 2heoh 11.11.13 в 08:02 |
||
|
blocking { 2heoh 11.11.13 в 08:02 |
||
|
Блокирующийся код также может вызывать исключения. В этом случае исключение будет перепослано в вызывающий код. 2heoh 11.11.13 в 08:05 |
