我已經閱讀了大量的文章和stackoverflow的問題,並且我看到很多關於線程池的信息,但是沒有人會談到物理CPU核心的用法。我相信這個問題不重複。Node.js線程池和核心使用
鑑於我有一個四核計算機和libuv線程池大小爲4,在處理大量I/O請求(可能超過數千個)時,Node.js是否會利用所有這4個內核?
我也很好奇I/O請求使用線程池。沒有人給出清楚而完整的請求清單。我知道Node.js事件循環是單線程的,但使用線程池來處理I/O,如訪問磁盤和數據庫。
我已經閱讀了大量的文章和stackoverflow的問題,並且我看到很多關於線程池的信息,但是沒有人會談到物理CPU核心的用法。我相信這個問題不重複。Node.js線程池和核心使用
鑑於我有一個四核計算機和libuv線程池大小爲4,在處理大量I/O請求(可能超過數千個)時,Node.js是否會利用所有這4個內核?
我也很好奇I/O請求使用線程池。沒有人給出清楚而完整的請求清單。我知道Node.js事件循環是單線程的,但使用線程池來處理I/O,如訪問磁盤和數據庫。
我也很好奇哪個I/O請求使用線程池。
磁盤I/O使用線程池。
網絡I/O從一開始就是異步的,並且不使用線程。
對於磁盤I/O,即使在本地代碼實現中使用線程,單個磁盤I/O調用仍然以非阻塞和異步方式呈現給Javascript。當進程超過線程池的大小時,磁盤I/O調用將進入排隊狀態,當其中一個線程釋放時,隊列中的下一個磁盤I/O調用將使用該進程運行現在可用的線程。由於磁盤I/O的Javascript都是非阻塞的,並且假設將來某個時候會調用完成回調,所以當線程池全部忙時請求的排隊意味着需要更長的時間才能到達後面的I/O請求,否則Javascript編程接口不受影響。
鑑於我有一個四核計算機和libuv線程池大小爲4,當處理大量I/O請求(可能超過數千)時,Node.js會使用所有這4個內核嗎?
這不是由node.js決定的,很難回答絕對的原因。 first referenced article below表示,在Linux上,I/O線程池將使用多個內核,並提供一個小型演示應用程序來顯示。
這取決於特定的操作系統實現和它使用的線程調度程序。 node.js只是愉快地創建線程並使用它們,然後操作系統決定如何使用CPU,因爲它要求在系統上完成整個操作。由於同一進程中的線程通常必須以某種方式相互通信,因此在同一進程中爲不同的線程使用單獨的CPU要複雜得多。
有一對夫婦的node.js設計模式,保證充分利用多內核的(在任何現代OS)
集羣您的應用程序,併爲你的處理器內核創建任意多個集羣。這也有一個好處,即每個集羣都有自己的I/O線程池,可以獨立工作,每個線程池都可以獨立執行自己的Javascript。只有一個node.js進程和多個內核,你永遠不會得到一個以上的Javascript執行線程(這是node.js被稱爲單線程的地方 - 儘管它在其庫實現中使用線程)。但是,通過集羣,您可以爲每個集羣服務器進程獲得獨立的Javascript執行。
對於可能會佔用大量CPU資源的個別任務(例如圖像處理),您可以創建一個工作隊列和一組您需要處理的子工作進程。這與羣集有一些共同之處,但它更具特殊用途,您可以確切地知道CPU瓶頸的位置,並且您想專門針對它進行攻擊。
其他相關答案/文章:
how libuv threads in nodejs utilize multi core cpu
Node.js on multi-core machines
愛這個答案,這是非常徹底。我想提一下,Node.js在我的選擇列表上相當低,但它是用於任何精細圖像處理的語言。也許你可以用網頁爬行來代替這個例子?就我個人而言,我可以看到使用多個線程來執行無頭瀏覽以及在所有線程之間循環鏈接的好處。 –
@PatrickRoberts - 對於通過解析抓取結果進行的網頁爬行,我可能只是集羣而不是工作隊列。在這種情況下,您將整個應用程序聚集到多個進程中,而不僅僅是其中的一部分,從中受益匪淺。而且,只有在獲取下一個URL來處理或保存結果時,您才需要在羣集之間進行協調。之間的一切都是完全獨立的。 – jfriend00
哦,我錯過了關於「工作隊列」的一點,我也只是想着集羣。我想在這種情況下,圖像處理是Node.js可以利用的任務級並行化的一個很好的例子。 –