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