【发布时间】:2020-05-04 23:43:09
【问题描述】:
在documentation for Node's Child Process spawn() function 和我在其他地方看到的示例中,模式是调用spawn() 函数,然后然后 在返回的@987654325 上设置一堆处理程序@ 目的。例如,这是该文档页面上给出的spawn() 的第一个示例:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
spawn() 函数本身在第二行被调用。我的理解是spawn() 异步启动一个子进程。来自文档:
child_process.spawn() 方法使用给定的方法生成一个新进程 命令,在 args 中带有命令行参数。
但是,上面脚本的以下几行继续为进程设置各种处理程序,因此假设在第 2 行调用 spawn() 之间该进程尚未实际启动(并且可能完成)其他事情发生在后续行。我知道 JavaScript/Node 是单线程的。但是,操作系统不是单线程的,并且天真地认为spawn() 调用告诉操作系统立即生成进程(此时,不幸的时机,操作系统可能会暂停父节点进程并在执行下一行 Node 代码之前运行/完成子进程)。
但必须是在当前 JavaScript 函数完成(或更一般地说,调用当前函数的当前 JavaScript 事件处理程序完成)之前,该进程实际上并没有生成,对吧?
这似乎是一件很重要的事情。为什么在子进程文档页面中没有这样说?是否有一些压倒一切的 Node 原则无需明确说明?
【问题讨论】:
-
这几乎是 nodejs 文档中解释的内容 - nodejs.org/en/docs/guides/event-loop-timers-and-nexttick
-
@Andy,谢谢。我看到文档确实谈到了这个问题,尽管它并没有像 jfriend00 的回答那样为我澄清事情。
标签: node.js asynchronous spawn