我担心的是它是否阻止了事件循环。因此,如果我确实调用了内部脚本,它会在脚本生命周期内阻止事件循环还是在其自己的线程上激活?
const { spawn } = require('child_process');
const pythonscript = spawn('py script.py');//assume this just runs forever
我从文档中清楚地了解到,这样做会产生一个新进程,但是该新进程是否与Nodejs应用程序共享同一线程,或者它拥有自己的线程?例如如果我检查了正在运行的进程,我会从字面上看到一个“ script.py”进程吗?
如果这是特定于操作系统的问题,请提供具有该假设的答案。
我担心的是它是否阻止了事件循环。
没有使用不以Sync
结尾的任何child_process方法启动新的子进程不会阻止事件循环。有短暂的执行时间来命令操作系统启动新进程,然后它返回,而您又回到自己的事件循环,而与子进程在做什么无关。
因此,如果我确实调用了内部脚本,它将在脚本的生命周期内阻止事件循环,还是在其自己的线程上激活?
“子进程”是新的“进程”。那不是您过程中的线程。这是一个全新的过程。
我从文档中非常清楚地了解到,这样做会产生一个新进程,但是该新进程是否与Nodejs应用程序共享同一线程,或者它拥有自己的线程?
每个进程都有它自己的主线程。因此,您启动的新子进程在其自己的进程中具有其自己的单独线程,完全独立于父进程。
如果我检查正在运行的进程,我会从字面上看到“ script.py”进程吗?
是的,你会的。这将是一个运行script.py
的python进程。
如果这是特定于操作系统的问题,请提供具有该假设的答案。
答案对于所有操作系统都是相同的。
现在,如果您使用了Sync
之类的child_process.spawnSync()
方法之一,那么它仍然会在自己的进程中启动子进程(该进程具有自己的主线程),但是要选择该方法的Sync
版本,您已经明确要求node.js进程阻塞事件循环,直到子进程完成(基本上等待它,然后再执行其他操作)。此行为仅适用于spawnSync()
,execFileSync()
和execSync()
。
除非您使用*Sync
功能(如execFileSync
),否则不会阻塞事件循环。
有关详细信息,请参见the child_process docs。