Action和Action.async之间有什么区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Action和Action.async之间有什么区别相关的知识,希望对你有一定的参考价值。

我对ActionAction.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中感到困惑,使用它的条件是什么

来自documentation

注意:Action.applyAction.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之间有什么区别的主要内容,如果未能解决你的问题,请参考以下文章

如何为测试环境配置Play

阿里云服务器不同的地域和可用区有什么区别?

阿里云服务器不同的地域和可用区有什么区别?

DNA和RNA测序之间有什么区别?

如何使用`flatMap`和`map`填充Play框架+ Scala上的`list`?

什么叫DMZ区?DMZ区有什么作用?应该怎样构建DMZ?