Как контекст выполнения из
import scala.concurrent.ExecutionContext.Implicits.global
отличаются от контекстов исполнения воспроизведения:
import play.core.Execution.Implicits.{internalContext, defaultContext}
Как контекст выполнения из
import scala.concurrent.ExecutionContext.Implicits.global
отличаются от контекстов исполнения воспроизведения:
import play.core.Execution.Implicits.{internalContext, defaultContext}
Они очень разные.
В Play 2.3.x и предыдущем, play.core.Execution.Implicits.internalContext
является ForkJoinPool
с фиксированными ограничениями на размер, которые используются внутри игры. Вы никогда не должны использовать его для своего кода приложения. Из документов:
Воспроизведение внутреннего пула потоков - это используется внутри игры. Никакой код приложения никогда не должен выполняться потоком в этом пуле потоков, и в этом пуле потоков никогда не должно быть блокировки. Его размер можно настроить, установив параметр internal-threadpool-size в application.conf, и по умолчанию используется количество доступных процессоров.
Вместо этого вы должны использовать play.api.libs.concurrent.Execution.Implicits.defaultContext
, который использует ActorSystem
.
В 2.4.x оба они используют один и тот же ActorSystem
. Это означает, что Akka будет распространять работу среди своего пула потоков, но таким образом, который невидим для вас (кроме конфигурации). Несколько актеров Akka могут делиться одним и тем же потоком.
scala.concurrent.ExecutionContext.Implicits.global
является ExecutionContext
, определенным в стандартной библиотеке Scala. Это специальный ForkJoinPool
, который использует метод blocking
для обработки потенциально блокирующего кода, чтобы порождать новые потоки в пуле. Вы действительно не должны использовать это в приложении Play, так как Play не будет контролировать его. Он также имеет потенциал для создания множества потоков и использования тонны памяти, если вы не будете осторожны.
Я написал больше о scala.concurrent.ExecutionContext.Implicits.global
в этом ответе.
Они одинаковы и указывают на диспетчера по умолчанию базовой действующей системы в вашем Play или Akka или комбинированное приложение.
play.api.libs.concurrent.Execution.Implicits.defaultContext
play.core.Execution.Implicits.internalContext
class ClassA @Inject()(config: Configuration)
(implicit ec: ExecutionContext) {
...
}
Но это другое:
scala.concurrent.ExecutionContext.Implicits.global
Также драйверы DB, например. если вы используете пятно, может возникнуть свой собственный контекст выполнения. Во всяком случае,
scala.concurrent.ExecutionContext.Implicits.global
, когда вы находитесь в игре или в каркасе akka, таким образом вы можете использовать больше потоков, чем оптимально во время высокой нагрузки, поэтому производительность может уменьшиться.scala.concurrent.ExecutionContext.Implicits.global
, если в вашем приложении нет другого исполнителя. Не беспокойтесь, это безопасно тогда.Await
для будущегоapplication.conf