Scala: ExecutionContext для будущего понимания

Когда я делаю future или применять методы, такие как onSuccess а также map Я могу указать для них ExecutionContext.

Например,

val f = future {
  // code
} executionContext

f.map(someFunction)(executionContext)

f onSuccess {
  // code
} executionContext

Тем не менее, если я использую для понимания будущего, как я могу указать ExecutionContext для yield часть?

for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?
} // (executionContext) here does not work

И что ExecutionContext запускает код в yield, если не указан?


РЕДАКТИРОВАТЬ

ХОРОШО. Благодаря ответам я что-то нашел.
Если я не определяю или импортирую неявный ExecutionContext (например, Implicits.global), для понимания не компилируется. Это означает, что для понимания используется неявный ExecutionContext.

Тогда, как я могу использовать для-понимания без неявного ExecutionContext, то есть, как указать?

2 ответа

Решение

ExecutionContext параметр на самом деле implicit, Это означает, что вы можете:

import scala.concurrent.ExecutionContext

implicit val context = ExecutionContext.fromExecutor(//etc)
for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?: the one above.
}

У вас также есть по умолчанию, а именно scala.concurrent.ExecutionContext.Implicits.global, Здесь столько потоков, сколько и процессоров на работающей машине.

По умолчанию он не будет использоваться всеми фьючерсами, вам все равно придется его импортировать.

Обновление: если вы действительно хотите указать, хотя это не рекомендуется, вы можете развернуть for yield

val combined = futureA.flatMap(x => futureB)(context)

Поскольку for Понимания "отображаются" на map / flatMap операции, а ExecutionContext параметры этих неявных, я думаю, вы можете попробовать добавить implicit val в местном масштабе:

implicit val myContext:ExecutionContext = ...

,

Я не верю, что есть неявное "по умолчанию" ExecutionContext, но наиболее часто используемый ExecutionContext.Implicits.global,

Другие вопросы по тегам