玩期货和网络延迟 - 什么级别的阻止?

时间:2014-02-22 18:06:20

标签: multithreading scala playframework jvm playframework-2.0

所以我们在操作系统上有一个JVM。在JVM中运行Play(scala)应用程序。这个应用程序使用Futures外出并获得三个API呼叫:

object MyAwsomeController extends Controller {

  val call1:Future[T] = scala.concurrent.future { ** call out across the wire to some awesome service ** }

  val call2:Future[T] = scala.concurrent.future { ** call out across the wire to another awesome service ** }

  val call3:Future[T] = scala.concurrent.future { ** call out across the wire to yet another different awesome service ** }

  def index() = Action { implicit request => 

      for {
        res1 <- call1
        res2 <- call2
        res3 <- call3
      } yield {
        Ok(views.html.index(res1, res2, res3)
      }

  }
}

现在,正如我所理解的那样,通过将对象声明为对象中的val,它们将在实例化(单例)MyAwesomeController对象时被调用 - 这可能不是一个好主意,因为Future [T]将是不可变的播放应用程序的持续时间。然而,我的目的是构建我的问题.Play应用程序(可能是一个StaticApplication()调用)在其线程上没有阻塞,但在某个地方,某种程度上必须阻止等待三个“并发”的结果通过电话呼叫。那么这是在JVM级别阻塞,还是OS上的套接字阻塞?

现在,如果我在for-yield理解中有api调用,那么:

for {
  res1 <- scala.concurrent.future { ** call out across the wire ** }
  res2 <- scala.concurrent.future { ** call out across the wire ** }
  res3 <- scala.concurrent.future { ** call out across the wire ** }

} ... 

然后每个对此路由/控制器的调用都将调用api,但只有在所有三个已完成(或超时?)时才会产生。所以,在系统的某个地方,有些东西是阻塞的。那么肯定会有一大堆客户端请求路由/控制器实际上为每个请求发起所有3个api调用。忙碌,路由/控制器是由1000个浏览器和盒子上的某个地方请求的,一堆线程确实实际阻塞(假设没有缓存)。确定,Play本身并没有阻塞,但整个系统正在使用大量被阻止的资源......?

我试图在这里对整个堆栈有一个层次的理解。在某些时候,必须阻止进行。某些线程(操作系统或JVM)必须等待其手指等待结果,即使主Play线程能够进行scoot并提供其他请求。

我是众所周知的狗在这里吠叫谚语错误的树,还是我在做什么?

感谢您的帮助!未来[感谢]

2 个答案:

答案 0 :(得分:0)

鉴于您提供的详细信息(实际上您没有“问题”),我建议这篇文章解释一切: http://www.playframework.com/documentation/2.2.x/ThreadPools

答案 1 :(得分:0)

  

我试图在这里对整个堆栈有一个层次的理解。在某些时候,必须阻止进行。

不,如果您使用的是异步I / O库(如NIO或Netty),情况并非如此。了解它们如何避免阻塞将导致您进入低级内核函数,如selectpollepoll,以及中断。

Wiki可能是一个很好的起点: http://en.wikipedia.org/wiki/Asynchronous_I/O