Nodejs是基於chrome瀏覽器的V8引擎構建的,也就說明它的模型與瀏覽器是類似的。我們的JavaScript會運行在單個進程的單個線程上。
但是V8引擎的單進程單線程並不是完美的結構,現如今CPU基本上都是多核的。真正的服務器往往有好幾個CPU(像我們的線上物理機有12個核),所以,這就將拋出Nodejs實際應用中的一個問題:“如何充分利用多核CPU服務器?”
從嚴格意義上來講,Node其實並不是真正的單線程架構,因為Node自身還有I/O線程存在(網絡I/O、磁盤I/O),這些I/O線程是由更底層的libuv處理,這部分線程對於JavaScript開發者來說是透明的。JavaScript代碼永遠運行在V8上,是單線程的。所以表面上來看NodeJS是單線程的。
node.js充分利用多核cpu的方法:
面對單進程單線程對多核使用率不高的問題,按照之前的經驗,每個進程各使用一個CPU即可,以此實現多核CPU的利用。Node提供了child_process模塊,並且也提供了fork()方法來實現進程的復制(只要是進程復制,都需要一定的資源和時間。Node復制進程需要不小於10M的內存和不小於30ms的時間)。
這樣的解決方案就是*nix系統上最經典的Master-Worker模式,又稱為主從模式。
這種典型並行處理業務模式的分布式架構具備較好的可伸縮性(可伸縮性實際上是和並行算法以及並行計算機體系結構放在一起討論的。某個算法在某個機器上的可擴放性反映該算法是否能有效利用不斷增加的CPU。)和穩定性。
主進程不負責具體的業務處理,而是負責調度和管理工作進程,工作進程負責具體的業務處理,所以,工作進程的穩定性是開發人員需要關注的。
通過fork()復制的進程都是一個獨立的進程,這個進程中有着獨立而全新的V8實例。雖然Node提供了fork()用來復制進程使每個CPU內核都使用上,但是依然要記住fork()進程代價是很大的。好在Node通過事件驅動在單個線程上可以處理大並發的請求。
注意:這里啟動多個進程只是為了充分將CPU資源利用起來,而不是為了解決並發問題。
電腦刺綉綉花廠 http://www.szhdn.com 廣州品牌設計公司https://www.houdianzi.com
Node創建子進程的4種方式:
1、spawn()
創建一個子進程來執行命令
2、exec()
創建一個子進程來執行命令,和spawn()不同的是方法參數不同,它可以傳入回調函數來獲取子進程的狀態
3、execFile()
啟動一個子進程來執行指定文件。注意,該文件的頂部必須聲明SHEBANG符號(#!)用來指定進程類型。
4、fork()
和spawn()類似,不同點在於它創建Node的子進程只需要執定要執行的JavaScript文件模塊即可。
注意:后面的3種方法都是spawn()的延伸應用。