Этот код с вложенными фьючерсами создает тупик? - PullRequest
1 голос
/ 06 ноября 2019

Предположим, у меня есть ExecutionContext резервная копия фиксированного пула потоков и функция foo, которая создает два вложенных фьючерса.

import scala.concurrent._

implicit val ec = ExecutionContext.fromExecutor(new ThreadPoolExecutor(...))
def foo(): Future[Int] = new Future {
  ...
  new Future { ... }
}   

Полагаю, этот код может создать тупик когда foo создает множество Futures, которые берут все потоки, а затем застревают, потому что не могут создать второе вложенное Future. Это правильно?

1 Ответ

2 голосов
/ 06 ноября 2019

Пока все Future работают до завершения без блокировки, тогда не может быть тупиков.

Если код внутри Future собирается блокировать, он должен быть внутри оператора blocking,Это создаст новый поток, чтобы предотвратить голодание потока исходного пула потоков.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...