firemail

标题: Node.js 子进程(exec、spawn、fork) [打印本页]

作者: Qter    时间: 2020-9-18 16:13
标题: Node.js 子进程(exec、spawn、fork)
本帖最后由 Qter 于 2020-9-18 16:16 编辑

https://blog.csdn.net/chy555chy/article/details/52556318

Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。

每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。

Node 提供了 child_process 模块来创建子进程,方法有:

1、exec

  1. require('child_process').exec('dir', {encoding: ‘utf-8’}, function(err, stdout, stderr) {
  2.     if (err) {
  3.         console.log(error.stack);
  4.         console.log('Error code: ' + error.code);
  5.         console.log('Signal received: ' + error.signal);
  6.     }
  7.     //console.log(err, stdout, stderr);
  8.     console.log('data : ' + stdout);
  9. }).on('exit', function (code) {
  10.     console.log('子进程已退出, 退出码 ' + code);
  11. });
复制代码

2、spawn


  1. var child_process = require('child_process');
  2. var spawnObj = child_process.spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
  3. spawnObj.stdout.on('data', function(chunk) {
  4.     console.log(chunk.toString());
  5. });
  6. spawnObj.stderr.on('data', (data) => {
  7.   console.log(data);
  8. });
  9. spawnObj.on('close', function(code) {
  10.     console.log('close code : ' + code);
  11. }
  12. spawnObj.on('exit', (code) => {
  13.     console.log('exit code : ' + code);
  14.     fs.close(fd, function(err) {
  15.         if(err) {
  16.             console.error(err);
  17.         }
  18.     });
  19. });
复制代码


3、fork
分为 “父进程”(parent.js) 和”子进程”(child.js)。在命令行执行的时候要切换到上述文件的目录中,否则会找不到子进程。

parent.js


  1. console.log('parent pid: ' + process.pid);
  2. var fork = require('child_process').fork;
  3. //fork方法返回的是子进程
  4. var child = fork('./child.js');
  5. console.log('fork return pid: ' + child.pid);
  6. child.on('message', function(msg){
  7.     console.log('parent get message: ' + JSON.stringify(msg));
  8. });
  9. child.send({key: 'parent value'});
复制代码


child.js


  1. console.log('child pid: ' + process.pid);
  2. process.on('message', function(msg){
  3.     console.log('child get message: ' + JSON.stringify(msg));
  4. });
  5. process.send({key: 'child value'});
复制代码


send 方法的原型为:

send(message, [sendHandle])

这里,sendHandle(handle)可以被用于发送:

send 发送 sendHandle 时实际上不是(也不能)直接发送 JavaScript 对象,而是发送文件描述符(最终以 JSON 字符串发送),其他进程能够通过这个文件描述符还原出对应对象。

注意: send方法是同步的因此不建议发送大量数据, 发送大量的数据可以使用 pipe 来代替







欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3