Play2! Action.async vs Action。它只是关于ExecutionContext吗?

时间:2014-05-18 17:03:54

标签: asynchronous playframework

recenlty我想知道Play Framework的一些简单概念。如果它们都运行异步,Action和Action.async之间有什么区别。我找到了很好的解释 - https://groups.google.com/forum/#!msg/play-framework-dev/30MqnKDp0Fs/25PU-Y0RhGoJ,这引出了我最后的问题 - 如果Action本身是异步的,它只是关于ExecutionContext吗?

因此,如果您在某些特定操作中进行面部识别计算,并且您希望在线程池方面将显示主页与此密集CPU算法执行分开,则编写Action.async。

1 个答案:

答案 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)
  }
}