进程和线程
“进程” 是计算机系统进行资源分配和调度的基本单位,我们可以理解为计算机每开启一个任务就会创建至少一个进程来处理,有时会创建多个,如 Chrome 浏览器的选项卡,其目的是为了防止一个进程挂掉而应用停止工作,而 “线程” 是程序执行流的最小单元,NodeJS 默认是单进程、单线程的,我们将这个进程称为主进程,也可以通过 child_process 模块创建子进程实现多进程,我们称这些子进程为 “工作进程”,并且归主进程管理,进程之间默认是不能通信的,且所有子进程执行任务都是异步的。
spawn 实现多进程
1、spawn 创建子进程
在 NodeJS 中执行一个 JS 文件,如果想在这个文件中再同时(异步)执行另一个 JS 文件,可以使用 child_process 模块中的 spawn 来实现,spawn 可以帮助我们创建一个子进程,用法如下。
// 文件:process.js
const { spawn } = require("child_process");
const path = require("path");// 创建子进程
let child = spawn("node", ["sub_process.js", "--port", "3000"], {
cwd: path.join(__dirname, "test") // 指定子进程的当前工作目录
});
// 出现错误触发
child.on("error", err => console.log(err));
// 子进程退出触发
child.on("exit", () => console.log("exit"));
// 子进程关闭触发
child.on("close", () => console.log("close"));
// exit
// close
spawn 方法可以帮助我们创建一个子进程,这个子进程就是方法的返回值,spawn 接收以下几个参数:
command:要运行的命令;
args:类型为数组,数组内第一项为文件名,后面项依次为执行文件的命令参数和值;
options:选项,类型为对象,用于指定子进程的当前工作目录和主进程、子进程的通信规则等,具体可查看 官方文档。
error 事件在子进程出错时触发,exit 事件在子进程退出时触发,close 事件在子进程关闭后触发,在子进程任务结束后 exit 一定会触发,close 不一定触发。
// 文件:~test/sub_process.js
// 打印子进程执行 sub_process.js 文件的参数
console.log(process.argv);通过上面代码打印了子进程执行时的参数,但是我们发现主进程窗口并没有打印,我们希望的是子进程的信息可以反馈给主进程,要实现通信需要在创建子进程时在第三个参数 options 中配置 stdio 属性定义。
2、spawn 定义输入、输出
// 文件:process.js
const { spawn } = require("child_process");
const path = require("path");// 创建子进程
let child = spawn("node", ["sub_process.js", "--port", "3000"], {









