Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 播放框架:异步与同步性能_Multithreading_Scala_Asynchronous_Playframework 2.0 - Fatal编程技术网

Multithreading 播放框架:异步与同步性能

Multithreading 播放框架:异步与同步性能,multithreading,scala,asynchronous,playframework-2.0,Multithreading,Scala,Asynchronous,Playframework 2.0,我有以下代码: def sync = Action { val t0 = System.nanoTime() Thread.sleep(100) val t1 = System.nanoTime() Ok("Elapsed time: " + (t1 - t0) / 1000000.0 + "ms") } def async = Action { val t0 = System.nanoTime() Async {

我有以下代码:

  def sync = Action {
      val t0 = System.nanoTime()
      Thread.sleep(100)
      val t1 = System.nanoTime()
      Ok("Elapsed time: " + (t1 - t0) / 1000000.0 + "ms") 
  }

  def async = Action {
    val t0 = System.nanoTime()
    Async { 
          Future{
            Thread.sleep(100)
            val t1 = System.nanoTime()
            Ok("Elapsed time: " + (t1 - t0) / 1000000.0 + "ms") 
            }   
    }
  }

上述代码的区别在于,sync将在接收请求的线程上休眠,而async将在单独的线程上休眠,这样负责接收请求的线程就可以继续接收请求而不会阻塞。当我分析线程时,我看到为异步请求创建的线程数量如预期的那样突然增加。但是,上述两种方法与4000并发连接20秒斜坡的结果是相同的吞吐量和延迟。我希望async的性能更好。为什么会这样?

简而言之,这两种方法本质上是相同的

动作本身总是异步的

在这两种情况下,睡眠调用都发生在操作的线程池中,这不是最优的

如下列文件所述:

Play框架自下而上是一个异步web框架。使用迭代对象异步处理流。游戏中的线程池被调整为使用比传统web框架中更少的线程,因为游戏核心中的IO永远不会阻塞

正因为如此,如果您计划编写阻塞IO代码,或者可能会执行大量CPU密集型工作的代码,那么您需要确切地知道哪个线程池正在承载该工作负载,并且需要相应地对其进行调优

例如,此代码片段使用单独的线程池:

Future {
  // Some blocking or expensive code here
}(Contexts.myExecutionContext)

作为附加资源,请参阅和,以获取有关处理异步操作和论坛消息的更多信息,以便对此主题进行广泛讨论。

简短的回答是,这两种方法本质上是相同的

动作本身总是异步的

在这两种情况下,睡眠调用都发生在操作的线程池中,这不是最优的

如下列文件所述:

Play框架自下而上是一个异步web框架。使用迭代对象异步处理流。游戏中的线程池被调整为使用比传统web框架中更少的线程,因为游戏核心中的IO永远不会阻塞

正因为如此,如果您计划编写阻塞IO代码,或者可能会执行大量CPU密集型工作的代码,那么您需要确切地知道哪个线程池正在承载该工作负载,并且需要相应地对其进行调优

例如,此代码片段使用单独的线程池:

Future {
  // Some blocking or expensive code here
}(Contexts.myExecutionContext)

作为附加资源,请参阅和,以获取有关处理异步操作和论坛消息的更多信息,以便对此主题进行广泛讨论。

它们实际上是一回事。他们俩真的是一回事。网络研讨会太棒了!谢谢的确我将视频链接添加到了答案中。网络研讨会太棒了!谢谢的确我把视频的链接添加到了答案中。