node.js如何充分利用多核cpu
概述
Nodejs是基于chrome瀏覽器的V8引擎構(gòu)建的,也就說明它的模型與瀏覽器是類似的。我們的JavaScript會運(yùn)行在單個進(jìn)程的單個線程上。
但是V8引擎的單進(jìn)程單線程并不是完美的結(jié)構(gòu),現(xiàn)如今CPU基本上都是多核的。真正的服務(wù)器往往有好幾個CPU(像我們的線上物理機(jī)有12個核),所以,這就將拋出Nodejs實(shí)際應(yīng)用中的一個問題:“如何充分利用多核CPU服務(wù)器?”
從嚴(yán)格意義上來講,Node其實(shí)并不是真正的單線程架構(gòu),因?yàn)镹ode自身還有I/O線程存在(網(wǎng)絡(luò)I/O、磁盤I/O),這些I/O線程是由更底層的libuv處理,這部分線程對于JavaScript開發(fā)者來說是透明的。JavaScript代碼永遠(yuǎn)運(yùn)行在V8上,是單線程的。所以表面上來看NodeJS是單線程的。
node.js充分利用多核cpu的方法
面對單進(jìn)程單線程對多核使用率不高的問題,按照之前的經(jīng)驗(yàn),每個進(jìn)程各使用一個CPU即可,以此實(shí)現(xiàn)多核CPU的利用。Node提供了child_process模塊,并且也提供了fork()方法來實(shí)現(xiàn)進(jìn)程的復(fù)制(只要是進(jìn)程復(fù)制,都需要一定的資源和時間。Node復(fù)制進(jìn)程需要不小于10M的內(nèi)存和不小于30ms的時間)。
這樣的解決方案就是*nix系統(tǒng)上最經(jīng)典的Master-Worker模式,又稱為主從模式。
這種典型并行處理業(yè)務(wù)模式的分布式架構(gòu)具備較好的可伸縮性(可伸縮性實(shí)際上是和并行算法以及并行計(jì)算機(jī)體系結(jié)構(gòu)放在一起討論的。某個算法在某個機(jī)器上的可擴(kuò)放性反映該算法是否能有效利用不斷增加的CPU。)和穩(wěn)定性。
主進(jìn)程不負(fù)責(zé)具體的業(yè)務(wù)處理,而是負(fù)責(zé)調(diào)度和管理工作進(jìn)程,工作進(jìn)程負(fù)責(zé)具體的業(yè)務(wù)處理,所以,工作進(jìn)程的穩(wěn)定性是開發(fā)人員需要關(guān)注的。
通過fork()復(fù)制的進(jìn)程都是一個獨(dú)立的進(jìn)程,這個進(jìn)程中有著獨(dú)立而全新的V8實(shí)例。雖然Node提供了fork()用來復(fù)制進(jìn)程使每個CPU內(nèi)核都使用上,但是依然要記住fork()進(jìn)程代價是很大的。好在Node通過事件驅(qū)動在單個線程上可以處理大并發(fā)的請求。
注意:這里啟動多個進(jìn)程只是為了充分將CPU資源利用起來,而不是為了解決并發(fā)問題。
Node創(chuàng)建子進(jìn)程的4種方式
1、spawn()
創(chuàng)建一個子進(jìn)程來執(zhí)行命令
2、exec()
創(chuàng)建一個子進(jìn)程來執(zhí)行命令,和spawn()不同的是方法參數(shù)不同,它可以傳入回調(diào)函數(shù)來獲取子進(jìn)程的狀態(tài)
3、execFile()
啟動一個子進(jìn)程來執(zhí)行指定文件。注意,該文件的頂部必須聲明SHEBANG符號(#!)用來指定進(jìn)程類型。
4、fork()
和spawn()類似,不同點(diǎn)在于它創(chuàng)建Node的子進(jìn)程只需要執(zhí)定要執(zhí)行的JavaScript文件模塊即可。
注意:后面的3種方法都是spawn()的延伸應(yīng)用。
以上就是node.js如何充分利用多核cpu的詳細(xì)內(nèi)容,更多關(guān)于node.js充分利用多核cpu的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js中的process.nextTick使用實(shí)例
這篇文章主要介紹了Node.js中的process.nextTick使用實(shí)例,nextTick函數(shù)有什么用、怎么用、和setTimeout有什么區(qū)別呢,本文就講解了這些知識,需要的朋友可以參考下2015-06-06NodeJS學(xué)習(xí)筆記之Connect中間件應(yīng)用實(shí)例
前面我們介紹了幾篇內(nèi)容的connect中間件的基礎(chǔ)知識,今天我們來實(shí)例應(yīng)用一下,做個記事本的小應(yīng)用,希望大家能夠喜歡。2015-01-01nodejs如何在package.json中設(shè)置多條啟動命令
這篇文章主要介紹了nodejs如何在package.json中設(shè)置多條啟動命令,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動登陸功能
日常工作當(dāng)中,為了提高工作效率,我們可能會寫腳本來自動執(zhí)行任務(wù),有些網(wǎng)站因?yàn)樾枰脩舻顷?所以腳本的自動登陸功能必不可少,這篇文章主要介紹了Nodejs Playwright 2Captcha 驗(yàn)證碼識別實(shí)現(xiàn)自動登陸功能,需要的朋友可以參考下2024-05-05