1. 程式人生 > >node多程序伺服器

node多程序伺服器

node提供了四種方法來建立子程序,分別是child_process.exec(),child_process.execFile(),
child_process.fork(),child_process.spawn()。他們都返回子程序物件。
exec:啟動一個子程序執行命令,並且有一個回撥函式獲知子程序的狀況。並且可以設定超時時間。
execFile:啟動一個子程序檔案,注意這裡的檔案不一定是js檔案,node可以執行的檔案,例如window下的
bat檔案,等並且也有一個回撥,並且可以設定超時時間。
spawn:只是簡單的執行一個子程序命令。不能設定超時時間。
fork:執行一個檔案,不能設定超時和回撥。


node程序間通訊,指父程序和子程序之間的通訊,子程序之間是不可以通訊的,有點想react的元件。通過send和message事件進行通訊。

//parent.js

let cp = require('child_process');
let n = cp.fork('./p_sub.js');
let time = new Date();
console.log('current time:'+ time);
n.on('message',function(msg){
console.log(`time have passd ${new Date() - time}`);
console.log('parent get message:' + msg.foo);
})
n.send({hello:'world'});
console.log('send ok');
while((new Date()) - time < 20){
// do nothing...
}

 

//sbu.js

let time = new Date();
console.log('current time:'+ time);
process.on('message',function(m){
console.log('massage from parent:' + m.hello);
process.send({foo:'bar'});
})

父子程序間通訊如此簡單。接下來就要談論關鍵的東西了,node的多程序伺服器。在這之前,我們還需要了解的一個東西叫做控制代碼,控制代碼可以理解問表示資源的引用,總感覺像是指標這樣的東西,可以理解為js物件名和物件之間的關係,不過這是系統對資源的引用,控制代碼可以是一個socket物件,套接字,管道等。父程序和子程序之間可以傳遞控制代碼。這就是弄的多程序伺服器的關鍵,主程序接受80埠(當然也可以其他埠)請求,然後將控制代碼 傳遞個子程序,由子程序處理,然後將結果傳送給主程序。豈不是很好。非同步I/O單執行緒,又充分利用cpu資源。如果這樣理解那你就錯了。其實node傳送的控制代碼,並不是真正的物件,而是這個物件的引用,這是一個搶佔是服務相當於多個程序同時監聽了同一個埠。

//process.js

let sub_process = require('child_process');
let child1 = sub_process.fork('./p_children.js');
let child2 = sub_process.fork('./p_children.js');
let child3 = sub_process.fork('./p_children.js');

let server = require('net').createServer();
server.listen(1337,function(){
child1.send('server',server);
child2.send('server',server);
child3.send('server',server);
server.close();
})

 

//p_children.js

let http = require('http');
let server = http.createServer(function(req,res){
res.writeHead(200,{'Conten-Type':'text-plain'});
res.end('handle by child,pis is ' + process.pid);
});

process.on('message',(m,tcp)=>{
if(m==='server'){
tcp.on('connection',function(socket){
server.emit('connection',socket);
})
}
})

這只是萬里長征的第一步,單執行緒總歸是不穩定的,例如檢測到子程序推出後重啟另一個程序,並且限制子程序數量,子程序之間要做負載均衡,又突然感覺一臉矇蔽,為應對這些node引入了cluster模組,解決多cpu利用率問題,上面提到的這些問題用cluster模組輕鬆搞定。

var cluster = require('cluster');

cluster.setupMaster({

exec:'p_children.js'

})

let cpus = require('os').cpus();

for(let i=0;i<cpus.length;i++){

cluster.fork();

}

這樣以來就感覺爽歪歪了,不過淡定,現在用pm2直接配置就可以做這個事情,所以上面你看的沒用,直接用pm2就對了。所以上面說的基本是扯淡。