2014-02-22 24 views
1

所以我們在操作系統上有一個JVM。在JVM中運行一個Play(scala)應用程序。這個程序使用期貨走出去,得到三個API調用:在他們於(單)的實例MyAwesomeController對象調用的對象聲明期貨丘壑播放期貨和網絡延遲 - 什麼級別的塊?

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) 
     } 

    } 
} 

現在,按照我的理解 - 這可能不是一個好主意,因爲未來[T]將在遊戲應用的持續時間內不可改變。然而,它的目的是爲我的問題提供框架。Play應用程序(可能是StaticApplication()調用)在其線程中未被阻塞,但在某處,某種方式必須阻止等待三個「併發」通過電話呼叫。那麼這是在JVM級別還是OS上的套接字塊?現在

,如果我有對收益的理解,正是如此裏面的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本身不會阻塞,但整個系統正在使用大量阻塞的資源......?

我想在這裏得到整個堆棧的層次理解。在某個時刻,必須阻止繼續。某些線程(OS或JVM)必須等待其手指等待結果,即使主Play線程能夠進行掃描並提供其他請求。

我是衆所周知的狗在這裏亂叫起來衆所周知錯了,還是我到什麼?

感謝您的幫助提前!未來[感謝]

+0

我寫了一些關於異步:

維基可能是一個很好的起點。這可以幫助您瞭解線程何時等待某些內容。 http://buransky.com/programming/await-without-waiting/ –

回答

0

我想獲得一個對整個堆棧的級別理解。在某個時刻,必須阻止繼續。

不,如果您使用的是異步I/O庫(如NIO或Netty),情況並非如此。瞭解它們如何避免阻塞會導致您使用低級內核函數,如selectpollepoll以及中斷。 /等待 http://en.wikipedia.org/wiki/Asynchronous_I/O