很抱歉,如果这听起来像是一个问题,我只能用google搜索,但找不到答案,或者我听不懂解释。
我的假设是,否则如何将子进程的输出通过管道传递给父进程。
但这是我不明白的:
let { spawn } = require('child_process');
if (process.argv[2] === "child") {
console.log("In if!!");
}else{
const child = spawn(process.execPath, [__filename, "child"]);
child.stdout.on("data", (data) => {
console.log("In else!! ", data.toString());
});
}
为什么输出
否则!!如果...
我认为,通过产生一个子进程,它会立即执行它,因此它进入if语句,在解决In if!!
之后,它将恢复到父进程,然后到达事件侦听器,从而使{{ 1}}。我有误会吗?
我的猜测是In else!!
实际上并没有记录日志,而是返回了console.log
字符串,然后将其传递给父进程,即回调中的In if
。但是如果是这样,为什么它实际上不记录日志?
谢谢您的提前答复。
答案 0 :(得分:0)
您的问题完全正确。
请记住,即使您生成多个进程(然后每个进程都将由系统进行单独管理),每个NodeJS进程内部的代码执行仍然保持单线程。
关于代码的第一件事是您正在使用spawn命令的异步版本。子进程是NodeJS API,因此其执行将受NodeJS规则(单线程)支配,因此它将像NodeJS中的任何其他异步函数一样运行(新的“独立”进程在spawn函数执行之前不会开始工作)。
话虽如此,您的父进程会将spawn添加到挂起的工作中,并在完成当前工作时(脚本结束时)运行它。
如果希望父进程等待子进程,则必须使用spawnSync命令。
有关更多信息,请参见NodeJS Child Process API Documentation中的异步过程创建和同步过程创建。