2017-07-07 34 views
0

Node.js是單線程的。 Javascript V8引擎和一些內部庫是多線程的。對於I/O,節點將I/O委託給可能是多線程的OS。節點爲單線程時,爲什麼我們需要node.js中的連接池?

如果我的Node.js應用程序連接到Redis的,或者SQL/MariaDB的服務器,我想我不應該需要的Redis或MySQL連接池。

作爲開發人員,我創造1個Redis的或MySQL連接並複用它來發送/獲取數據。當數據到達時,節點將調用回調來處理數據。

我明白連接與Java/.NET池,但他們是多線程的,所以用Java/.NET連接池有明顯的好處。

我的問題是:爲什麼我們需要在node.js的連接池時,節點是單線程的?它有什麼好處嗎?如果開發人員不這樣做,節點是否不利用底層操作系統和JavaScript引擎的多線程功能?

感謝

回答

2

節點運行代碼單線程的。但是,Node.js實際上有一個線程池供您的代碼無法訪問。線程機制通過libuv實現。請深入瞭解libuv book並解釋libuv的內部工作原理。

基本上,你的代碼是事件循環(單線程)的上下文中運行。然後將任何異步工作卸載到池中的可用線程,並且事件循環將進行輪詢,直到其中一個線程完成異步工作。完成後,異步調用註冊的回調函數將被調用,並在事件循環的下一個I/O Callback Phase期間開始工作。您可以在Node.js docs中閱讀有關Event Loop及其階段的更多信息。

之一建立與該事件循環樣式的應用程序的好處,是通常與多線程應用程序相關聯的臨界區編碼(mutexs,信號量等)的抽象。

+0

謝謝你的評論和鏈接。那麼使用redis連接池或mysql連接池會有什麼好處,因爲節點將使用其內部線程池進行I/O操作? – Avneet

+0

當然,這些連接池仍然讓你有正在爲等待新的連接被打開頭頂的共享和可代替多個連接。這是正確實施時的優化。 – peteb

+0

@Avneet也從Redis的和mysql的線程池,仍在與libuv就像你的代碼運行。所以沒有一個由這些軟件包創建的獨立池。你的代碼是用這些包實現的,你的代碼是單線程運行的,這些池只是提供開放的連接,只是等待工作。無需等待連接打開。 – peteb

0

您需要連接池,因爲即使一個線程可以擁有多個「堵」 DB連接(假設RDBMS這裏)。如果沒有連接池,您的應用程序將爲每個額外的數據庫請求創建每個連接,即使在像Node這樣的異步/非阻塞系統中也是如此。

實施例:

request 1 - insert user -- wait for response (assume it's 5 secs) 
request 2 - insert invoice - wait for response (assume it's 3 secs) 
request 3 - insert another invoice 

注意請求3被處理向右走,而不必等待請求1和2來完成。在這個單線程中,我們已經使用了三個資源連接到數據庫。想象一下,每次需要DB操作時都必須創建每一個。從連接池中獲取一個更快!

相關問題