gpt4 book ai didi

node.js - 为什么 Nodejs 生成进程会变成 直到父进程退出

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:28 27 4
gpt4 key购买 nike

我们先来看看现象

Nodejs 代码:

const cp = require('child_process');

var ls = cp.spawn('ls', ['/']);

ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
console.log(`child process closed with code ${code}`);
});

while(true){}

运行这个nodejs代码,没有任何显示,似乎没有触发任何事件。

然后在另一个shell中运行“ps -ef | grep ls | grpe -v grep”,结果为:

liyuanq+ 10995 10990  0 11:06 pts/3    00:00:00 [ls] <defunct>

如果删除代码:

while(true){}

Node 进程退出,并触发on data事件。

问题是为什么 Node 在实际完成其工作时不关闭生成的进程,直到父 Node 进程退出。

我的环境:

操作系统:Debian 8.4 x86_64

Node :v6.1.0

最佳答案

非常有趣的观察,谢谢!

如果有一个专用线程对子进程执行wait(),这种情况就不会发生

如果子进程退出和父进程执行 wait() 之间存在间隙,则子进程将在该间隙内被视为失效。

在 Node 中,由于我们只有一个线程,并且它正在执行无限循环,因此它无法进入事件循环、拦截子进程退出并从任务列表中清除子进程的 ID。

如果您用具有长延迟的 setTimeout 替换 while-true 循环,线程将获得空闲 CPU,等待子级并将其从任务列表中清除 - 我已经验证了这一点。

希望这有帮助。

关于node.js - 为什么 Nodejs 生成进程会变成 <defunct> 直到父进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37825670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com