【问题标题】:Will a child process block the parent process in node.js?子进程会阻塞 node.js 中的父进程吗?
【发布时间】:2019-11-22 14:38:20
【问题描述】:

很抱歉,如果这听起来像是一个问题,我可以用谷歌搜索,但我找不到答案,或者我无法理解解释。
我的假设是它会,否则如何将子进程的输出通过管道传输到父进程。
但这是我不明白的:

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!! 后,它恢复到父进程,然后到达事件侦听器,从而安慰In else!!。我是不是误会了什么?
我的猜测是console.log,实际上并没有记录,而是返回In if字符串,然后将其传递给父进程,也就是回调中的data。但如果是这样的话,为什么它实际上不记录呢?

感谢您提前回复。

【问题讨论】:

    标签: javascript node.js process


    【解决方案1】:

    你的问题完全正确。

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

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

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

    如果你想让你的父进程等待子进程,你必须使用 spawnSync 命令。

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

    【讨论】:

    • 但是在子进程中,为什么不在第一个if语句中记录In if!!呢?是因为子进程的标准输出是将其通过管道传输到父进程吗?只是为了澄清事情,你能逐行解释发生了什么吗?这将帮助我更快地理解。谢谢
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多