node是基于v8引擎单线程运行,这的单线程运行指的是JavaScript代码在单线程上运行,node还有其他的线程,比如进行异步IO操作的IO线程。这种单线程模型带来的好处就是系统调度过程中不会频繁进行上下文切换,提升了单核CPU的利用率。
node的单程运行无法利用cpu多核,一个node进程只能利用一个cpu。单线程模式下一旦代码崩溃,就是整个程序崩溃,通常解决方案就是使用Node的cluster模块,通过master-worker模式启用多个进程实例。
1、理解node如何创建子进程
node提供了产生进程的方式 --- 派生(fork),引用 child_process 模块。它主要是执行在一个单独的处理器上运行另外一个V8引擎实例中的Node.js模块代码。可以用派生来并行运行多个服务。
fork(modulePath,[args],[options])对象也是返回一个ChildProcess对象。
参数:
modulePath:字符串,指定被新的Node.js实例启动的JavaScript文件路径。
args:数组,指定传递给node命令的命令行参数。
options:参数对象,指定执行命令时使用的设置。
事件:
Child.on('message', function(){})父进程绑定消息事件,Process.on('message', function(){})是子进程绑定消息事件。
Child.send()父进程向子进程发送消息,Process.send()是子进程向父进程发送消息。
示列:
//fork.js
const path = require('path');
const child = require('child_processs');
const childrens = child .fork(path.join(__dirname, 'worker.js'));
childrens .on('message', (msg) => {
console.log(msg);
});
childrens .send('msg from master');
//worker.js
process.on('message', (msg)=>{
console.log(msg);
});
process.send('message from child');
2、node多进程(cluster模块)
cluster模块,用于多核CPU环境下多进程的负载均衡。利用该模块可以很容易的创建共享同一端口的子进程服务器。
//服务
const cluster = require('cluster');
const cpuNum = require('os').cpus().length;
const http = require('http');
if(cluster.isMaster){
console.log(`master is start ${process.pid}`);
for(let i=0;i<cpuNum;i++){
cluster.fork();
}
}else{
http.createServer((req, res)=>{
res.end('response from woker ${process.pid}');
}).listen(8080);
console.log(`worker ${process.pid} started`);
}
//http模拟
var http = require('http');
var options = {port: '3000'};
function sendRequest(){
http.request(options, function(response){
var serverData = '';
response.on('data', function(chunk){
serverData += chunk;
});
response.on('end', function(){
console.log(serverData);
});
}).end();
}
for(var i=0;i<15;i++){
console.log("Sending Request");
sendRequest();
}
网友评论