recenlty我想知道Play Framework的一些简单概念。如果它们都运行异步,Action和Action.async之间有什么区别。我找到了很好的解释 - https://groups.google.com/forum/#!msg/play-framework-dev/30MqnKDp0Fs/25PU-Y0RhGoJ,这引出了我最后的问题 - 如果Action本身是异步的,它只是关于ExecutionContext吗?
因此,如果您在某些特定操作中进行面部识别计算,并且您希望在线程池方面将显示主页与此密集CPU算法执行分开,则编写Action.async。
答案 0 :(得分:1)
使用普通Action
Play会将代码包装到异步构造中(Future
)。当您已有Future
结果时,可以使用Action.async
结构。默认情况下,您可以通过导入ExecutionContext
使用默认ThreadPool
(大致相当于play.api.libs.concurrent.Execution.Implicits._
) - 但您可能还需要设置自定义上下文,例如
object Contexts {
implicit val expensiveDbLookups: ExecutionContext = Akka.system.dispatchers.lookup("contexts.expensive-db-lookups")
}
并在conf/application.conf
contexts {
expensive-db-lookups {
fork-join-executor {
parallelism-max = 4
}
}
}
Action.async
基本上允许您直接使用Future
- s,频繁组合为WS library:
def users = Action.async { implicit request =>
WS.url("http://www.cloudusers.com/123/list").get().map { response =>
Ok(response.json)
}
}