NodeJs的“子进程”如何与事件循环交互?

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

我担心的是它是否阻止了事件循环。因此,如果我确实调用了内部脚本,它会在脚本生命周期内阻止事件循环还是在其自己的线程上激活?

  const { spawn } = require('child_process');
  const pythonscript = spawn('py script.py');//assume this just runs forever

我从文档中清楚地了解到,这样做会产生一个新进程,但是该新进程是否与Nodejs应用程序共享同一线程,或者它拥有自己的线程?例如如果我检查了正在运行的进程,我会从字面上看到一个“ script.py”进程吗?

如果这是特定于操作系统的问题,请提供具有该假设的答案。

javascript node.js child-process
2个回答
1
投票

我担心的是它是否阻止了事件循环。

没有使用不以Sync结尾的任何child_process方法启动新的子进程不会阻止事件循环。有短暂的执行时间来命令操作系统启动新进程,然后它返回,而您又回到自己的事件循环,而与子进程在做什么无关。

因此,如果我确实调用了内部脚本,它将在脚本的生命周期内阻止事件循环,还是在其自己的线程上激活?

“子进程”是新的“进程”。那不是您过程中的线程。这是一个全新的过程。

我从文档中非常清楚地了解到,这样做会产生一个新进程,但是该新进程是否与Nodejs应用程序共享同一线程,或者它拥有自己的线程?

每个进程都有它自己的主线程。因此,您启动的新子进程在其自己的进程中具有其自己的单独线程,完全独立于父进程。

如果我检查正在运行的进程,我会从字面上看到“ script.py”进程吗?

是的,你会的。这将是一个运行script.py的python进程。

如果这是特定于操作系统的问题,请提供具有该假设的答案。

答案对于所有操作系统都是相同的。


现在,如果您使用了Sync之类的child_process.spawnSync()方法之一,那么它仍然会在自己的进程中启动子进程(该进程具有自己的主线程),但是要选择该方法的Sync版本,您已经明确要求node.js进程阻塞事件循环,直到子进程完成(基本上等待它,然后再执行其他操作)。此行为仅适用于spawnSync()execFileSync()execSync()


2
投票

除非您使用*Sync功能(如execFileSync),否则不会阻塞事件循环。

有关详细信息,请参见the child_process docs

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