Action和Action.async之间有什么区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Action和Action.async之间有什么区别相关的知识,希望对你有一定的参考价值。
我对Action
和Action.async
的使用感到困惑。什么是使用它的适当条件。我用Action.async
编写了一个带有for循环的方法,需要12秒才能处理:
def asyncIndex() = Action.async {
val time = Calendar.getInstance().get(Calendar.SECOND)
Future {
for(i<- 0 to 20000000) {
print(i)
}
Ok(Json.toJson(time))
}
}
当我同时向此方法发出两个请求时,第二个请求将被阻止,直到第一个请求完成。
PS: - 我想我还没有理解关于异步调用的正确概念。
我在Action和Action.async中感到困惑,使用它的条件是什么
注意:
Action.apply
和Action.async
都会创建以相同方式在内部处理的Action
对象。有一种Action
,它是异步的,而不是两种(同步的和异步的)。.async
构建器只是简化基于返回Future
的API创建操作的工具,这使得编写非阻塞代码变得更加容易。
当我同时向这个方法发出两个请求时,第二个请求被阻塞,直到第一个请求完成
也来自documentation:
在等待响应时将阻止Web客户端,但服务器上不会阻止任何内容,并且可以使用服务器资源为其他客户端提供服务。
如果您的同时请求来自同一个同步客户端,则客户端上的其中一个请求将被阻止,直到另一个请求完成。服务器端没有阻塞。要实现对同一端点的请求的并行处理,请使用不同的客户端来发出这些请求,或使用进行异步HTTP调用的客户端。还要考虑为此端点使用单独的调度程序,即使您将处理包装在Future
中(有关创建自定义调度程序的更多信息,请参阅链接文档)。
代码中的等待块创建了等待时间:用Future
体写的代码不是完全并发的,因为在发送Ok
响应之前有一个循环;很明显,当您发送呼叫时,需要一些时间来获得第二个响应。如果您删除for循环并发送调用次数(例如通过curl
),您将看到该应用程序正在运行而没有“等待”时间。当然这有局限性;这是你的机器的规格(cpu,ram等)。所以,单独使用Action.async
并在其中写入等待/阻塞;不会使整个代码并发。
何时使用:有一个简单的规则:如果你的控制器的方法体中有并发代码,那么该动作应定义为Action.async{...}
;如果不是Action{...}
。
请注意,在Play all actions are asynchronous。
以上是关于Action和Action.async之间有什么区别的主要内容,如果未能解决你的问题,请参考以下文章