在nodejs中建立cluster

2021-10-18 13:15:58 字數 4784 閱讀 1038

cluster中的worker

總結我們知道,nodejs的event loop或者說事件響應處理器是單執行緒的,但是現在的cpu基本上都是多核的,為了充分利用現代cpu多核的特性,我們可以建立cluster,從而使多個子程序來共享同乙個伺服器端口。

也就是說,通過cluster,我們可以使用多個子程序來服務處理同乙個埠的請求。

先看乙個簡單的http server中使用cluster的例子:

正在執行`);

// 衍生工作程序。

for(

let i =

0; i < numcpus; i++

) cluster.on(

'exit'

,(worker, code, signal)

=>

已退出`);

});}

else).

listen

(8000);

console.

log(

`工作程序

$已啟動`);

}cluster模組源自於lib/cluster.js,我們可以通過cluster.fork()來建立子工作程序,用來處理主程序的請求。

cluster繼承自events.eventemitter,所以cluster可以傳送和接收event。

cluster支援7中event,分別是disconnect,exit,fork,listening,message,online和setup。

在講解disconnect之前,我們先介紹乙個概念叫做ipc,ipc的全稱是inter-process communication,也就是程序間通訊。

ipc主要用來進行主程序和子程序之間的通訊。乙個工作程序在建立後會自動連線到它的主程序。 當 『disconnect』 事件被觸發時才會斷開連線。

觸發disconnect事情的原因有很多,可以是主動呼叫worker.disconnect(),也可以是工作程序退出或者被kill掉。

cluster.on(

'disconnect'

,(worker)

=>

已斷開連線`);

});

exit事件會在任何乙個工作程序關閉的時候觸發。一般用來監測cluster中某乙個程序是否異常退出,如果退出的話使用cluster.fork建立新的程序,以保證有足夠多的程序來處理請求。

cluster.on(

'exit'

,(worker, code, signal)

=>

);

fork事件會在呼叫cluster.fork方法的時候被觸發。

const timeouts =

;function

errormsg()

cluster.on(

'fork'

,(worker)

=>

);

主程序和工作程序的listening事件都會在工作程序呼叫listen方法的時候觸發。

cluster.on(

'listening'

,(worker, address)

=>:$

`);}

);

其中worker代表的是工作執行緒,而address中包含三個屬性:address、 port 和 addresstype。 其中addresstype有四個可選值:

message事件會在主程序收到子程序傳送的訊息時候觸發。

當主程序生成工作程序時會觸發fork,當工作程序執行時會觸發online。

setupmaster方法被呼叫的時候,會觸發setup事件。

cluster中三個方法,分別是disconnect,fork和setupmaster。

cluster.

disconnect

([callback]

)

呼叫cluster的disconnect方法,實際上會在cluster中的每個worker中呼叫disconnect方法。從而斷開worker和主程序的連線。

當所有的worker都斷開連線之後,會執行callback。

cluster.

fork

([env]

)

fork方法,會從主程序中建立新的子程序。其中env是要新增到程序環境變數的鍵值對。

fork將會返回乙個cluster.worker物件,代表工作程序。

最後乙個方法是setupmaster:

cluster.

setupmaster

([settings]

)

預設情況下,cluster通過fork方法來建立子程序,但是我們可以通過setupmaster來改變這個行為。通過設定settings變數,我們可以改變後面fork子程序的行為。

我們看乙個setupmaster的例子:

const cluster =

require

('cluster');

cluster.

setupmaster()

;cluster.

fork()

;// https 工作程序

cluster.

setupmaster()

;cluster.

fork()

;// http 工作程序

通過cluster物件,我們可以通過ismaster和isworker來判斷程序是否主程序。

可以通過worker來獲取當前工作程序物件的引用:

const cluster =

require

('cluster');

if(cluster.ismaster)

else

if(cluster.isworker)`)

;}

可以通過workers來遍歷活躍的工作程序物件:

// 遍歷所有工作程序。

function

eachworker

(callback)

}eachworker

((worker)

=>

);

每個worker都有乙個id編號,用來定位該worker。

worker類中包含了關於工作程序的所有的公共的資訊和方法。cluster.fork出來的就是worker物件。

worker的事件和cluster的很類似,支援6個事件:disconnect,error,exit,listening,message和online。

worker中包含3個屬性,分別是:id,process和exitedafterdisconnect。

其中id是worker的唯一標記。

worker中的process,實際上是childprocess物件,是通過child_process.fork()來建立出來的。

因為在worker中,process屬於全域性變數,所以我們可以直接在worker中使用process來進行傳送訊息。

exitedafterdisconnect表示如果工作程序由於 .kill() 或 .disconnect() 而退出的話,值就是true。如果是以其他方式退出的話,返回值就是false。如果工作程序尚未退出,則為 undefined。

我們可以通過worker.exitedafterdisconnect 來區分是主動退出還是被動退出,主程序可以根據這個值決定是否重新生成工作程序。

cluster.on(

'exit'

,(worker, code, signal)

=>})

;// 殺死工作程序。

worker.

kill()

;

worker還支援6個方法,分別是:send,kill,destroy,disconnect,isconnected,isdead。

這裡我們主要講解一下send方法來傳送訊息:

worker.

send

(message[

, sendhandle[

, options]][

, callback]

)

可以看到send方法和child_process中的send方法引數其實是很類似的。而本質上,worker.send在主程序中,這會傳送訊息給特定的工作程序。 相當於 childprocess.send()。在工作程序中,這會傳送訊息給主程序。 相當於 process.send()。

if

(cluster.ismaster)

else

if(cluster.isworker));

}

在上面的例子中,如果是在主程序中,那麼可以使用worker.send來傳送訊息。而在子程序中,則可以使用worker中的全域性變數process來傳送訊息。

使用cluster可以充分使用多核cpu的優勢,希望大家在實際的專案中應用起來。

Nodejs在ubuntu中安裝

最近在學習nodejs,所以就有了這篇文章。安裝所需要的依賴包 sudo apt get install g curl libssl dev apache2 utils sudo apt get install python sudo apt get install build essential ...

在WSL中安裝nodejs

wget 解壓安裝包 tar xvf node v10.15.1 linux x64.tar.xz我這邊解壓後的目錄是 usr local node v10.15.1 linux x64 將nodejs加入環境變數中 修改配置全域性環境變數配置檔案 vim etc profile 需要root許可權...

在Linux中安裝Nodejs中安裝

英文 中文 通過 uname a 命令檢視到我的linux系統位數是64位 備註 x86 64表示64位系統,i686 i386表示32位系統 如圖 2 解壓上傳 解壓後的檔案我這邊將名字改為了nodejs,這個地方自己隨意,只要在建立軟連線的時候寫正確就可以 tar xvf node v6.10....