执行上下文是什么?
import scala.concurrent.ExecutionContext.Implicits.global
与 Play 的执行上下文不同:
import play.core.Execution.Implicits.{internalContext, defaultContext}
执行上下文是什么?
import scala.concurrent.ExecutionContext.Implicits.global
与 Play 的执行上下文不同:
import play.core.Execution.Implicits.{internalContext, defaultContext}
play.core.Execution.Implicits.internalContext
是一个具有固定大小限制的ForkJoinPool
,由Play内部使用。您永远不应在应用程序代码中使用它。从文档中得知:
相反,您将使用Play内部线程池 - 这是由Play内部使用的。没有应用程序代码应该由此线程池中的线程执行,并且在此线程池中永远不应阻止。它的大小可以通过在application.conf中设置internal-threadpool-size来配置,默认为可用处理器数量。
play.api.libs.concurrent.Execution.Implicits.defaultContext
,它使用ActorSystem
。ActorSystem
。这意味着Akka将在其自己的线程池中分配工作,但以对您不可见的方式(除了配置)。几个Akka actors可以共享同一个线程。
scala.concurrent.ExecutionContext.Implicits.global
是在Scala标准库中定义的ExecutionContext
。它是一个特殊的ForkJoinPool
,使用blocking
方法处理可能阻塞的代码,以便在池中生成新线程。您真的不应在Play应用程序中使用它,因为Play无法控制它。如果不小心,它还有可能产生大量线程并使用大量内存。scala.concurrent.ExecutionContext.Implicits.global
。它们是相同的,指向您的Play或Akka或组合应用程序底层actor系统的默认调度程序。
## Play默认上下文
play.api.libs.concurrent.Execution.Implicits.defaultContext
##Play的内部环境
play.core.Execution.Implicits.internalContext
##Guice的EC注入
class ClassA @Inject()(config: Configuration)
(implicit ec: ExecutionContext) {
...
}
但这是不同的:
scala.concurrent.ExecutionContext.Implicits.global
此外,例如如果您使用slick,数据库驱动程序可能会提供自己的Execution Context。无论如何,
scala.concurrent.ExecutionContext.Implicits.global
,否则在高负载期间可能会使用比最优更多的线程,从而导致性能降低。scala.concurrent.ExecutionContext.Implicits.global
。这是安全的。application.conf
中定义新调度程序的方法很好用前言: 此问题来自6年前,自那时起很多事情已经改变。我知道这不是对原始问题的回答,但我曾受到与原始问题陈述相同的困惑超过1天;所以我决定与社区分享我的研究结果。
最新的关于ExecutionContext的更新,完美适用于Play 2.8.15, 如下所示。 Play 2.6迁移指南:
play.api.libs.concurrent.Execution类已弃用,因为它在内部使用全局可变状态来获取“当前”应用程序的ExecutionContext。 如果您想指定之前隐式行为,则应在构造函数中传递execution context。
因此,您不能再使用play.api.libs.concurrent.Execution.Implicits.defaultContext
。无需配置即可使用的做法是为控制器提供一个类型为scala.concurrent.ExecutionContext
的隐式值,例如:
import scala.concurrent.ExecutionContext
@Singleton
class AsyncController @Inject()(cc: ControllerComponents, actorSystem: ActorSystem)(implicit exec: ExecutionContext) extends AbstractController(cc)
这意味着以上答案都不适用了,而且问题本身也已经不相关了,因为play.core.Execution.Implicits.defaultContext
不再可用。