2015-04-17 55 views
1

我知道一個典型的Play應用程序將在每個CPU內核中使用一個線程。如果我沒有弄錯,當一個線程訪問一個異步I/O函數時,它會在其等待返回值時爲其他進程打開該線程。如何在Play中處理異步回調!框架?

我的問題是關於返回值時會發生什麼。當回調準備好執行時,Play框架如何將這個任務重新分配到應用程序中?它是否有像Node.js這樣的隊列,其中每個「就緒」回調被引入到主隊列中,並且應用程序範圍內的事件循環在它們變爲可用時將它們逐一推回到線程中?你需要知道

回答

1

一切都在這裏:

https://www.playframework.com/documentation/2.3.x/ThreadPools

不同節點,遊戲不只是一個事件循環,播放具有線程池。 Play的線程池實際上通常配置爲每個內核有多個線程,並且有多個用於不同目的的池。

至於事件是如何觸發的,它取決於任務。在http連接上執行IO,還有一個Netty老闆線程調用select來接收所有註冊的http連接的新事件。只要發生什麼事情,它就會將工作委託給Netty工作線程,然後Play會做一些工作,並可能將進一步的工作委託給Play線程池。但可能會有其他事件循環,具體取決於您正在使用的其他庫,連接池等。

+0

因此,只是爲了確保我理解這一點並糾正我,如果我錯了。因此,Netty Boss線程將收到一個客戶請求,並委託給工作線程,而工作線程從通道執行非阻塞讀寫,然後刪除到Play默認線程池(這是我們的應用程序),並做一些工作,並且最後結果將被Future/Promise包裝起來,並且在完成時會被另一個執行回調的線程取回,但是它使用哪個線程池? – peter