作为单线程事件驱动的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开启子进程')
})
这里先跑通后面等有时间深入学习的时候在来补充,加油!!!