执行上下文如何来自
import scala.concurrent.ExecutionContext.Implicits.global
与Play的执行上下文不同:
import play.core.Execution.Implicits.{internalContext, defaultContext}
答案 0 :(得分:42)
他们非常不同。
在Play 2.3.x及之前版本中,play.core.Execution.Implicits.internalContext
是一个ForkJoinPool
,其大小受到固定限制,由Play内部使用。您永远不应该将它用于您的应用程序代码。来自文档:
播放内部线程池 - 这由Play内部使用。此线程池中的线程不应执行任何应用程序代码,并且不应在此线程池中执行任何阻止。可以通过在application.conf中设置internal-threadpool-size来配置它的大小,它默认为可用处理器的数量。
相反,您可以使用play.api.libs.concurrent.Execution.Implicits.defaultContext
,它使用ActorSystem
。
在2.4.x中,它们都使用相同的ActorSystem
。这意味着Akka将在其自己的线程池中分配工作,但是以一种对您来说不可见的方式(除了配置)。几个Akka演员可以共享同一个帖子。
scala.concurrent.ExecutionContext.Implicits.global
是Scala标准库中定义的ExecutionContext
。这是一个特殊的ForkJoinPool
,使用blocking
方法处理可能阻塞的代码,以便在池中生成新线程。你真的不应该在Play应用程序中使用它,因为Play无法控制它。它还有可能产生很多线程并使用大量内存,如果你不小心的话。
我已在this answer中详细了解scala.concurrent.ExecutionContext.Implicits.global
。
答案 1 :(得分:7)
它们是相同的,并指出您的基础actor系统的默认调度程序 播放或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
,这样你在高负荷时可能会使用比最佳线程更多的线程,因此性能可能会降低。scala.concurrent.ExecutionContext.Implicits.global
。不要担心这是安全的。Await
未来application.conf
中定义新的调度程序