Node产生的子进程何时真正开始?

问题描述 投票:0回答:2

documentation for Node's Child Process spawn() function中,以及在其他地方看到的示例中,模式是调用spawn()函数,而then则在返回的spawn()对象上设置一堆处理程序。例如,这是该文档页面上给出的ChildProcess的第一个示例:

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()异步启动子进程。从文档中:

child_process.spawn()方法使用给定的方法生成一个新进程命令,在args中带有命令行参数。

但是,上面脚本的以下几行继续为该进程设置各种处理程序,因此,假设在第2行和第二行之间调用spawn()的过程中,该进程尚未真正启动(并可能完成)。其他的事情发生在随后的几行中。我知道JavaScript / Node是单线程的。但是,操作系统不是单线程的,天真的会读到spawn()调用,告诉操作系统立即生成该进程(此时,不幸的是,操作系统可能会挂起父Node进程,并且在执行节点代码的下一行之前运行/完成子进程)。

但是必须确保在当前JavaScript函数完成之前(或更通常地说,调用当前函数的当前JavaScript事件处理程序完成),实际上不会产生该过程,对吧?

这似乎很重要。为什么在“子流程”文档页面中没有这么说?是否有一些压倒一切的Node原则,因此不必明确地说出来?

node.js asynchronous spawn
2个回答
1
投票

新进程的产生立即开始(已移交给操作系统以实际启动该进程并使它继续运行)。用spawn()启动新过程是异步且无阻塞的。因此,它将启动操作系统的操作并立即返回。您可能认为这就是为什么可以在事件返回后设置事件处理程序的原因(因为该过程尚未完成启动)。好吧,是的,不是。它可能尚未完成新过程的启动,但这不是行之有效的主要原因。


0
投票

这是对jfriend00的回答,以解释它对我的理解,以防它对其他人有帮助。我知道JavaScript / Node的事件驱动性质。 jfriend00的解释对我来说很清楚,即事件可以发生,Node可以知道它发生了,但实际上直到下一个滴答声时,它才真正决定要告诉该事件的处理程序。例如,如果setTimeout()调用完全失败(例如,命令不存在),Node显然会立即知道。我的想法是,它将立即将适当的处理程序排队以在下一个刻度上运行。但是我现在所了解的是,它会将“原始事件”(即,生成失败的事实,包括有关它的任何详细信息)放入队列中,然后在下一个刻度上将其determines

© www.soinside.com 2019 - 2024. All rights reserved.