Asynchronous 游戏2!Action.async vs Action。它只是关于ExecutionContext的吗?

Asynchronous 游戏2!Action.async vs Action。它只是关于ExecutionContext的吗?,asynchronous,playframework,Asynchronous,Playframework,最近,我想知道一些关于Play框架的简单概念。如果Action和Action.async都运行异步,那么它们之间的区别是什么。我已经找到了很好的解释-,这就引出了最后一个问题-若动作本身是异步的,那个么它只是关于ExecutionContext的吗 因此,如果您在某个特定操作中进行人脸识别计算,并且希望将显示主页与此密集的CPU算法执行从线程池中分离出来,那么您可以编写Action.async。使用简单的操作Play将负责将代码包装到异步构造中(Future)。当您已经有了一个Future结果时

最近,我想知道一些关于Play框架的简单概念。如果Action和Action.async都运行异步,那么它们之间的区别是什么。我已经找到了很好的解释-,这就引出了最后一个问题-若动作本身是异步的,那个么它只是关于ExecutionContext的吗


因此,如果您在某个特定操作中进行人脸识别计算,并且希望将显示主页与此密集的CPU算法执行从线程池中分离出来,那么您可以编写Action.async。

使用简单的
操作
Play将负责将代码包装到异步构造中(
Future
)。当您已经有了一个
Future
结果时,您可以使用
Action.async
构造。默认情况下,您可以使用默认的
ExecutionContext
(大致相当于
ThreadPool
)通过导入
play.api.libs.concurrent.Execution.Implicits.\u
-但您可能还需要设置自定义上下文,例如

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,一种常见的组合是:


嗯,如果您没有任何自定义执行上下文,那么只使用Action而不使用async是完全可以的?是的。如果您的Action计算依赖于
未来
,那么您将直接使用
Action.async
,而不是在普通的
Action
主体中显式阻塞(因为它不期望未来,而是一个具体的值)。例如,当您使用异步
WS
库进行web服务调用时,通常会出现这种情况。
def users = Action.async { implicit request =>
  WS.url("http://www.cloudusers.com/123/list").get().map { response =>
    Ok(response.json)
  }
}