子进程会阻塞node.js中的父进程吗?

时间:2019-11-22 14:38:20

标签: javascript node.js process

很抱歉,如果这听起来像是一个问题,我只能用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。但是如果是这样,为什么它实际上不记录日志?

谢谢您的提前答复。

1 个答案:

答案 0 :(得分:0)

您的问题完全正确。

请记住,即使您生成多个进程(然后每个进程都将由系统进行单独管理),每个NodeJS进程内部的代码执行仍然保持单线程。

关于代码的第一件事是您正在使用spawn命令的异步版本。子进程是NodeJS API,因此其执行将受NodeJS规则(单线程)支配,因此它将像NodeJS中的任何其他异步函数一样运行(新的“独立”进程在spawn函数执行之前不会开始工作)。

话虽如此,您的父进程会将spawn添加到挂起的工作中,并在完成当前工作时(脚本结束时)运行它。

如果希望父进程等待子进程,则必须使用spawnSync命令。

有关更多信息,请参见NodeJS Child Process API Documentation中的异步过程创建和同步过程创建。