028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

nodejs中怎么实现多进程

今天就跟大家聊聊有关nodejs中怎么实现多进程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

成都创新互联主营巴彦网站建设的网络公司,主营网站建设方案,成都App定制开发,巴彦h5微信小程序开发搭建,巴彦网站营销推广欢迎巴彦等地区企业咨询

为什么要使用多进程
多进程和多线程介绍
  • 进程是资源分配的最小单位,线程是CPU调度的最小单位

  • 进程--资源分配最小单位,线程--程序咨询最小单位

一个进程下面的线程是可以去通信的,共享资源

多线程和多线程的选择

多进程和多线程一般可以结合起来使用

对比维度多进程多线程总结
数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个导致同步复杂各有优势
内存、cpu占用内存多,切换负责,cpu利用率低占用内存少,切换简单,cpu利用率高线程占优
创建销毁、切换创建销毁复杂,速度慢创建销毁简单,速度很快线程占优
编程、调试编程简单,调试简单编程复杂、调试复杂进程占优
可靠性进程间不会相互影响一个线程挂掉将导致整个进程挂掉进程占优
分布式适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单适应于多核分布式进程占优
nodejs多线程
创建多进程

利用cluster开启多进程

const cluster = require('cluster'); // 多进程
const http = require('http');
const numCpus = require('os').cpus().length; // 获取cpu的核数
if(cluster.isMaster){ // 是否是主线程
    for(var i = 0; i < numCpus; i++){
        cluster.fork() // 开启子线程
    cluster.on('exit', function(worker, code ,signal){
// 监测哪个进程挂掉
        console.log('worker'+worker.process.pid+'died')
    })
    }
} else {
  http.createServer((req,res) =>{
    res.writeHead(200);
    res.end('hello world');
  }).listen(8000)  
}
多进程和单进程性能对比

多进程的性能要明显好于单进程

nodejs调试工具
cluster 相关API

Process进程,child_process子进程,Cluster集群

process 进程

process对象是Node的一个全局对象,提供当前Node进程的信息,它也可以在脚本的任意位置使用,不必通过require获取;

属性

  1. process.argv属性,返回一个数组,包含了node进程时的命令行参数;

  2. process.env返回包含用户环境信息的对象,可以在脚本中心对这个队形进行curd操作;

  3. process.pid返回当前进程的进程号

  4. process.platform 返回当前的操作系统

  5. process.version 返回当前node的版本

方法

  1. process.cwd() 返回node.js进程当前的工作目录

  2. proces.chdir() 变更node.js进程的工作目录

  3. process.nextTick() 将任务放到当前时间循环的尾部,添加到next tick队列,一旦当前时间轮询队列的任我全部完成,在next tick队列的所有callback会被依次调用;

  4. process.exit() 退出当前进程时触发;很多时候是不需要的;

  5. process.kill(pid[,signal]) 给指定的进程发信号,包括但不限于结束进程;

事件

  1. beforeExit事件,在node清空了EventLoop之后,再没有任何待处理任务时触发,可以在这里再部署一些任务,使得node进程不退出,显示的终止程序时(process.exit()),不会触发;

  2. exit事件,当前进程退出时触发,回调函数中只允许同步操作,因为执行完回调后,进程全部退出;

  3. uncaughtException事件,兜底方案,当前进程抛出一个没有捕获的异步错误时触发,可以用它在进程结束前进行一些已分配资源的同步清理操作,尝试用它来恢复应用的正常运行的操作是不安全的;

  4. warning事件;任何nodejs发出的警告都会触发此事件;

bbb()  
// 这里会直接报错,因为js是单线程的,
// uncaughtException专门是捕捉异步代码错误,特别是http
process.on('uncaughtException', (err) =>{
    console.log(err)
})
const http = require('http');
http.createServer((req, res) => {
    ccc()
}).listen(8000, () => {
    console.log(`server is runing on 8000`)
})

process.on('uncaghtException', (err) => { 
// 这里会捕获ccc的异步错误s
    console.log('发生错误',err)
})
child_process

node中用于创建子进程的模块,cluster就是基于child_process模块封装的;

  1. child_process.exec()

const exec = require('child_process').exec;

// 1. 通过回调的方式接收结果
// exec('ls', (err, stdout, stderr) => {
//   // 在node中,容错处理和业务代码一样重要;
//   // 因为js是单线程,一旦发生错误,后面代码就不会执行
//   if (err) {
//     console.log('stderr', stderr);
//   }
//   console.log('err', err);
//   console.log('stdout', stdout);
// });

// 由于标准输出和标准错误都是流对象(stream),可以监听data事件
// 2. 通过流的方式返回结果,
// 可以一边读取一边接收结果,不用等所有文件读取完
var child = exec('lss');
child.stdout.on('data', data => {
  console.log(data);
});
// 发生错误
child.stderr.on('data', err => {
  console.log('发生错误了', err);
});

console.log(111)
  1. child_progress.execSync() 同步方法

var execSync('child_progress');
var path = '../'
var child = execSync(`ls ${path} \ rm rf`); //  这样会删除此文件夹的上一级目录的所有文件
console.log(child.toString());
  1. execFile()

const { execFile } = require('child_progress')
execFile('ls', ['-c'], (err, stdout, stderr) => {
    console.log('stdout', stdout)
})
  1. child_process.spawn()

const { spawn } = require('child_process');
let child = spawn('ls', ['-c']);
child.stdout.on('data', data => {
  console.log('data', data.toString('utf8'));
});
  1. child_process.fork()

main.js

const child_process = require('child_process');
const path = require('path');
var child = child_process.fork(path.resolve(__dirname, './child.js'));
child.on('message', data => {
  console.log('父接收到子消息:', data);
});
child.send('父亲send', data => {
  console.log('父亲说:为父给你发消息了');
});

child.js

process.on('message', data => {
  console.log('儿子接收到父亲消息:', data);
});

process.send('儿子send', data => {
  console.log('儿子对父亲说:hello ');
});

看完上述内容,你们对nodejs中怎么实现多进程有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


网页题目:nodejs中怎么实现多进程
网站路径:http://www.tsicrk.com/article/pgodhj.html

其他资讯

让你的专属顾问为你服务

3.5884s