Не может Promise.complete
просто запустить Future.onComplete
«s обратный вызова, а не пройти весь путь через ExecutionContext
и, как я понимаю, график Future.onComplete
» s обратного вызова для последующего использования и потенциально запустить его в другом потоке?Почему Future.onComplete Scala нуждается в ExecutionContext
ответ
Вы можете предоставить свой собственный ExecutionContext
к onComplete
, который будет запускать код на одной и той же теме:
val immediateContext: ExecutionContext = new ExecutionContext {
def execute(runnable: Runnable) {
runnable.run()
}
def reportFailure(cause: Throwable) {}
}
вы можете даже сделать его implicit
, и за исключением случаев, когда вы хотите выполнение занять место в другом потоке, вы можете предоставить scala.concurrent.ExecutionContext.global
или какой-либо другой контекст.
Вот тест, как это работает:
val immediateContext: ExecutionContext = new ExecutionContext {
override def reportFailure(cause: Throwable): Unit = {}
override def execute(runnable: Runnable): Unit = {
println("Executing")
runnable.run()
println("Executed")
}
}
def testContext(): Unit = {
println("Scheduling on an uncompleted future")
val p = Promise[Int]()
println("Scheduling")
p.future.onComplete { _ => println("Completed") }(immediateContext)
println("Scheduled")
p.complete(Success(5))
println()
println("Scheduling on an already completed future")
val p2 = Promise[Int]().complete(Success(5))
println("Scheduling")
p2.future.map { n =>
println("Mapping")
n * 2
}(immediateContext).onComplete{
case Success(n) => println(s"Completed: $n")
case _ =>
}(immediateContext)
println("Scheduled")
println()
println("Using scala.concurrent.ExecutionContext.global for comparison")
val p3 = Promise[Int]().complete(Success(5))
println("Scheduling")
p3.future.onComplete {
_ => println("Completed")
}(concurrent.ExecutionContext.global)
println("Scheduled")
}
Запуск testContext()
напечатает
Scheduling on an uncompleted future
Scheduling
Scheduled
Executing
Completed
Executed
Scheduling on an already completed future
Scheduling
Executing
Mapping
Executed
Executing
Completed: 10
Executed
Scheduled
Using scala.concurrent.ExecutionContext.global for comparison
Scheduling
Scheduled
Completed
Это дизайнерское решение для реализации фреймов scala, все операции (map, flatMap и т. Д.) Требуют неявного ExecutionContext.
Если вы хотите, чтобы лучше нить повторного использования и меньше переключения контекста между потоками я предлагаю вам взглянуть на scalaz Task, немного отличается абстракции для отсроченных вычислений: http://timperrett.com/2014/07/20/scalaz-task-the-missing-documentation/
- 1. В Scala, почему нет реализации для `Future.onComplete`?
- 2. Scala, PlayFramework, Mockito, ExecutionContext null
- 3. Scala: ExecutionContext для будущего понимания
- 4. Почему Scala нуждается в инструкции def?
- 5. Почему Scala нуждается в дублирующем конструкторе? (java.lang.NoSuchMethodException)
- 6. Scala ExecutionContext для вызовов API REST
- 7. Есть com.twitter.util.Local для Scala Future и ExecutionContext?
- 8. Future.onComplete: не может понять сигнатурный метод
- 9. Scalatest ExecutionContext
- 10. В вертике следует использовать vertx ExecutionContext для выполнения завершения проекта Scala?
- 11. Когда вызывается ExecutionContext # reportFailure (Throwable)?
- 12. Функция ошибки возвратного типа с future.onComplete
- 13. Использовать Scala ExecutionContext, когда сторонняя библиотека запрашивает ExecutorService
- 14. Как работает .NET ExecutionContext?
- 15. Рекурсивное значение xxx нуждается в типе в Scala
- 16. ExecutionContext использовать с mapAsync в Акка-Streams
- 17. Почему Scala использует ForkJoinPool для возврата к исполнению по умолчанию ExecutionContext?
- 18. Должен ли я переопределять стандартный ExecutionContext?
- 19. Как включить собственные данные в ExecutionContext
- 20. SDL2 - Почему SDL_CreateTextureFromSurface() нуждается в рендерере *?
- 21. Почему Lucene QueryParser нуждается в анализаторе
- 22. Почему производный конструктор нуждается в базовом деструкторе?
- 23. Почему моя черта нуждается в параметре lifetime?
- 24. Почему Unity нуждается в ссылках на сборку
- 25. Hadoop namenode всегда нуждается в форматировании, почему?
- 26. Почему SqlDataAdapter.InsertCommand нуждается в другом SqlConnection?
- 27. Почему Android нуждается в виртуальной машине (DVM)?
- 28. Почему метод addActionListener нуждается в этих этапах?
- 29. Почему WiFiP2P нуждается в разрешении на интернет?
- 30. Почему start-stop-daemon нуждается в привилегиях?