bjf*_*her 28 scala playframework
如何执行上下文
import scala.concurrent.ExecutionContext.Implicits.global
Run Code Online (Sandbox Code Playgroud)
与Play的执行上下文不同:
import play.core.Execution.Implicits.{internalContext, defaultContext}
Run Code Online (Sandbox Code Playgroud)
Mic*_*jac 44
他们是非常不同的.
在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是ExecutionContextScala标准库中定义的.ForkJoinPool使用该blocking方法处理可能阻塞的代码以便在池中生成新线程是一种特殊的方法.你真的不应该在Play应用程序中使用它,因为Play无法控制它.如果你不小心的话,它也有可能产生大量的线程并使用大量的内存.
我scala.concurrent.ExecutionContext.Implicits.global在这个答案中写了更多.
它们是相同的,并指向Play或Akka或组合应用程序中基础actor系统的默认调度程序.
play.api.libs.concurrent.Execution.Implicits.defaultContext
Run Code Online (Sandbox Code Playgroud)
play.core.Execution.Implicits.internalContext
Run Code Online (Sandbox Code Playgroud)
class ClassA @Inject()(config: Configuration)
(implicit ec: ExecutionContext) {
...
}
Run Code Online (Sandbox Code Playgroud)
但这是不同的:
scala.concurrent.ExecutionContext.Implicits.global
Run Code Online (Sandbox Code Playgroud)
此外,数据库驱动程序,例如,如果您使用光滑,可能会提出自己的执行上下文.无论如何,
scala.concurrent.ExecutionContext.Implicits.global当你在游戏或akka框架中时,不要使用这种方式,在高负载时你可能会使用比最佳线程更多的线程,因此性能可能会降低.scala.concurrent.ExecutionContext.Implicits.global在应用程序中没有其他执行程序运行时使用.不要担心这是安全的.Await是一个未来application.conf| 归档时间: |
|
| 查看次数: |
6346 次 |
| 最近记录: |