Node.js入门笔记(9):进程与进程通信

199 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

Node单线程存在很多潜在的问题,并且单线程无法充分利用多核CPU导致对硬件的浪费,Node从0.1版本提供了child_process模块来提供多线程的支持,child_process模块中提供了很多创建子进程的方法,比如fork、spawn、exec、exceFile

1.spawn

我们先来看下spawn,spawn会生成一个新进程,执行完后子进程会自动退出并且返回一个child_process给开发者进行事件监听

let child_process = require('child_process');
let ls = child_process.spawn('powershell',["dir"])
ls.stdout.on('data',(data)=>console.log(data.toString()))

spawn接收一个文件名,执行完代码我们会看到下面的结果显示出了我们文件夹下的所有文件 image.png

2.fork

Linux环境下的fork是操作系统为新进程分配空间,并且复制父进程的数据,父进程和子进程只有PID等少数值不相等。

Node中父子进程都有独立的内存空间和V8实例,并不会复制父进程,父子之间的通信使用的是IPC Channel,fork接收一个文件名,相当于通过node加载js文件,例如 node xxx.js,父子进程之间通过process.send方法进行通信

//node.js
let child_process = require('child_process');
let wk = child_process.fork('./多线程/worker.js',["args1"])
wk.on('exit',()=>console.log('child process exit'))
wk.send({hello:"child"})
wk.on('message',(msg)=>console.log('node '+msg.hello))
//worker.js
let begin = process.argv[2]
console.log('begin '+begin);
process.on("message",(msg)=>{
    console.log('worker '+msg.hello);
    process.exit()
})
process.send({hello:"parent"})

上面这段代码是在node.js文件中通过fork访问worker文件,并且传送一个参数,接着声明一个监听进程退出的函数,向子进程发送一段消息,并且设置一个监听消息的函数

在worker进程中:process.argv可以接收传送过来的参数,并且通过process.on方法设置一个监听函数,如果接收到了,就打印并退出进程,最后一行是进程发送了一个信息出去

image.png

我们可以从结果中看到最先执行的是子进程中的begin,因为node中从上往下执行,先访问worker文件,接着node中发送消息,在子进程中被监听到,此时俩个进程都是异步进行的,所以即使worker中监听到消息后退出了进程,worker中的send仍然生效,会被node.js中的监听事件监听到