所以我們在操作系統上有一個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線程能夠進行掃描並提供其他請求。
我是衆所周知的狗在這裏亂叫起來衆所周知錯了,還是我到什麼?
感謝您的幫助提前!未來[感謝]
我寫了一些關於異步:
維基可能是一個很好的起點。這可以幫助您瞭解線程何時等待某些內容。 http://buransky.com/programming/await-without-waiting/ –