hawx1993 / tech-blog

📦My personal tech blog,not regularly update
http://sf.gg/u/trigkit4/articles
339 stars 30 forks source link

你需要知道的Node.js Child Processes #15

Open hawx1993 opened 7 years ago

hawx1993 commented 7 years ago

创建Node子进程的方式

node.js提供了child_process模块,通过多进程来实现对多核CPU的利用.child_process模块提供了四个创建子进程的函数,分别是spawn()exec()execFile()fork()

每个子进程可以获取三个标准的stdio流,我们可以使用child.stdinchild.stdoutchild.stderr访问它们。

child_process.exec():是“同步中的异步”, 它要等到子进程运行结束以后然后一次性返回所有的buffer数据。衍生一个 shell 并在 shell 上运行一个命令,当完成时会传入 stdout 和 stderr 到一个回调。

child_process.spawn是“异步中的异步”,会返回一个带有stdout和stderr流的对象,在子线程开始执行后,就开始不断将数据从子进程返回给主进程。

child_process.spawn(command[, args][, options])
child_process.exec(command[, options][, callback])
child_process.execFile(file[, args][, options][, callback])
child_process.fork(modulePath[, args][, options])

总结一下:当你想要从子进程返回大量数据时使用spawn,如果只是返回简单的状态信息,那么使用exec。

execSync是exec的同步执行版本。

image

var child_process = require('child_process');
child_process.execFile( file , function(err, stdout , stderr ) {
  console.log( stdout );
});
var child_process = require('child_process');
child_process.fork( modulePath );

image

使用 child_process.fork() 生成新进程之后,就可以用 child.send(message, [sendHandle])向新进程发送消息。新进程中通过监听message事件,来获取消息。

异步 vs 同步

大部分时候,子进程的创建是异步的。也就是说,它不会阻塞当前的事件循环,这对于性能的提升很有帮助。

当然,有的时候,同步的方式会更方便(阻塞事件循环),比如通过子进程的方式来执行shell脚本时。

node同样提供同步的版本,比如: 来自child_process模块​​的函数spawn,exec和execFile具有同步阻止的版本:

const { 
  spawnSync, 
  execSync, 
  execFileSync,
} = require('child_process');