我只是好奇地了解node.js内部。我们需要执行shell脚本并将输出捕获到变量中。我们找到了以下解决方案
const exec = require('child_process').exec;
exec('pwd', (err, stdo, stde) => {
if (err) return;
// capture output .. it can grow later
out = stdo;
});
setTimeout(() => console.log('test'), 3000);
.exec
和setTimeout
异步运行。但是, setTimeout 不会创建单独的进程或线程(它使用libuv或V8异步API),这些异步调用由系统池处理(因为它不会为每个setTimeout创建进程或线程)速度更快,内存更少)
现在,当我运行 .exec 时,我们正在使用child_process
(这可能会生成单独的进程),我们假设它将在node.js上创建一个thread or process
级别(例如我们如何在 Java和C#中创建线程)。派生一个进程或线程会花费一些时间,并且还会消耗进程内存大小。
.exec
的工作原理类似于Java和C#线程吗?还是运行类似于使用V8异步API或libuv的setTimeout?
简而言之,如果我运行一百万个setTimeouts
,则该过程将不会挂起(demo shown by Ryan Dahl)。如果我创建了100万个.exec()
,其行为是否类似于setTimeouts或它是否因生成的进程而过分夸大并炸毁了服务器? (一旦获得访问权限,我会尝试,但我真的很想知道内部行为,而不是隐约地说它消失了)。
任何帮助将不胜感激。
最后,如果仅执行shell脚本,Node.js是用于处理并发连接的语言的很好选择吗?
参考:
https://zaiste.net/nodejs-child-process-spawn-exec-fork-async-await/
提及child_process模块允许在以下位置创建子进程 Node.js。
https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
生成一个shell,然后在该shell中执行命令。