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
,