node多线程方案

作为单线程事件驱动的node来说拥有非阻塞I/O快速开发等诸多有点,但是node并不完美对于cpu密集型这样的任务并不适合node。在这个硬件设备越来越好的时代,动不动就是4核8线程但是node却不能很好的利用这些高性能硬件的优势。
对于node我还是比较喜欢的,因此去网上查找了各种node实现多线程的资料。

threads_a_gogo

这个中间件是可以实现node多线程的但是对于window系统的我来说好像没什么卵用(装不上)Linux和mac OS的可以试一下。

众里寻他千百度,蓦然回首那人却在灯火阑珊处。官方文档上其实已经有给我们提供了child-process这个node原生的子进程模块,一般版本在10.11及以上版本的node应该都有支持(我自己用的是最新的10.15版本)。

child-process提供了4种方法来衍生子进程spawn,fork,exec,execFile。

新建js文件引入必要的模块和另一个测试js文件

const {spawn,fork,exec,execFile} = require('child_process'); 
const path = require('path')

测试js

console.log('子进程1')

spawn

这里用stdout和childProcessTest生成的子进程进行联系

const ls = spawn('node', ['childProcessTest.js'],{
    cwd: __dirname, //子进程目录
    detached: true // true当父进程不存在时也可以独立存在
  }
);
ls.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
});
ls.on('close', (code) => {
    console.log(`子进程退出码:${code}`);
});
ls.on('error', (err) => {
    console.log('无法启动子进程');
});

这里要记得处理捕捉错误不然程序会报错。

fork

衍生一个新的 Node.js 进程,主进程与子进程之间相互发送信息

const child = fork(path.join(__dirname, './childProcessTest.js'))
child.on('message', (data) => { 
   console.log('父进程接收到消息' + data) 
}) 
child.send('hello fork') 
child.on('error', (err) => {
   console.error(err) 
})

子进程

//fork衍生的一个线程,父子线程可通信
process.on('message', (data, setHandle) => {
  console.log('子进程接收到消息' + data)
  process.send(data)
})

 exec和execFile类似

//exec开启子进程
let exec1 = exec(
  'node',
  {cwd: path.join(__dirname, './childProcessTest.js')},
  function(err, stdout, stderr) {
  console.log(stdout,'exec开启子进程')
})
// //execFile开启子进程
let exec2 = execFile(
  'node',
  {cwd: path.join(__dirname, '/childProcessTest.js')},
  function(err, stdout, stderr) {
  console.log(stdout,'execFile开启子进程')
})

这里先跑通后面等有时间深入学习的时候在来补充,加油!!!

猜你喜欢

转载自blog.csdn.net/qq_40816649/article/details/88644359