child_process

child_process提供了衍生子进程的能力。

node单线程的问题就是会导致无法充分利用CPU等资源,通过child_process实现子进程,从而实现1个主进程(master),多个子进程的模式(工作进程)。

创建异步的子进程

  • child_process.exec(command[, options][, callback])
    执行的是非node程序,是一个shell命令,执行结果以回调的形式返回。

    【注意】
    1、command 是一个 shell 命令的字符串,一般是 shell 内置的 命令或shell脚本组成的文件,如 ls、cat、start.sh等,包含了命令的参数;
    2、可以使用 callback;
    3、执行成功,error为null;失败,error为Error的实例,error.code为错误码;
    4、若timeout大于0,则当子进程运行超过timeout毫秒,会给进程发送killSignal指定的信号;

    1. 回调函数
    const { exec } = require('child_process');
    exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {if (error) {console.error(`执行的错误: ${error}`);return;}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);
    });2. Promise
    const util = require('util');
    const exec = util.promisify(require('child_process').exec);async function lsExample() {const { stdout, stderr } = await exec('ls');console.log('stdout:', stdout);console.error('stderr:', stderr);
    }
    lsExample();
    
  • child_process.execFile(file[, args][, options][, callback])
    执行的是非node程序,是一个可执行文件或应用,执行结果以回调的形式返回。

    【注意】
    1、比exec更高效,更安全;
    2、命令的参数只能作为第二个参数传递;
    3、默认情况下不会衍生 shell(和exec的最大差别),指定的可执行 file 直接作为新进程衍生;
    3、file 是要运行的可执行文件的名称或路径,如 node.exe,不能是 start.js 这种脚本文件;
    4、不支持I/O重定向,文件glob等;

    1. 回调函数
    const { execFile } = require('child_process');
    const child = execFile('node', ['--version'], (error, stdout, stderr) => {if (error) {throw error;}console.log(stdout);
    });2. Promise
    const util = require('util');
    const execFile = util.promisify(require('child_process').execFile);
    async function getVersion() {const { stdout } = await execFile('node', ['--version']);console.log(stdout);
    }
    getVersion();
    
  • child_process.spawn(command[, args][, options])
    执行的是非node程序,是一个shell命令,不需要获取执行结果,执行结果以流的形式返回。

    【注意】
    1、 使用给定的 command 衍生一个新进程,并带上 args 中的命令行参数,默认是空数组;
    2、以流的形式,可以减少内存占用提高输入输出效率;

    1. 检查失败的spawn
    const { spawn } = require('child_process');
    const subprocess = spawn('bad_command');subprocess.on('error', (err) => {console.error('启动子进程失败');
    });2. 运行ls -lh /usr,并捕获stdout、stderr、退出码
    const { spawn } = require('child_process');
    const ls = spawn('ls', ['-lh', '/usr']);ls.stdout.on('data', (data) => {console.log(`stdout: ${data}`);
    });ls.stderr.on('data', (data) => {console.error(`stderr: ${data}`);
    });ls.on('close', (code) => {console.log(`子进程退出,退出码 ${code}`);
    });
    
  • child_process.fork(modulePath[, args][, options])
    执行的是node程序,是一个.js文件,不需要获取执行结果,执行结果以流的形式返回,fork出来的进程一定是node进程。

    【注意】
    1、专门用于衍生新的 node进程;
    2、返回子进程ChildProcess对象,并内置为一个额外的IPC通信通道,允许消息在父进程和子进程之间来回传递,子进程独立于父进程;
    3、modulePath 要在node子进程中运行的模块,由于是 node.js 的进程,所以可以是 .js 文件;
    4、无回调,参数要以第二个参数传入;

通过process.on('message')和process.send()的机制来接收和发送消息
child.js
process.on('message',function(msg){process.send(msg)
})parent.js
let cp=require('child_process');
let child=cp.fork('./child');
child.on('message',function(msg){console.log('got a message is',msg);
});
child.send('hello world');// child.disconnect() 父进程中调用, 断开父子间IPC通信// got a message is hello world

ChildProcess类

1、childProcess的实例代表衍生的子进程;
2、每个实例都有stdout、stdin、stderr三个流对象;

  • subprocess.stderr 子进程的stderr可读流,subprocess.stderr 是 subprocess.stdio[2] 的别名。 两个属性都将会指向相同的值;

  • subprocess.stdin 子进程的stdin的可写流,subprocess.stdin 是 subprocess.stdio[0] 的别名。 两个属性都将会指向相同的值;

  • subprocess.stdio 一个到子进程的稀疏数组,subprocess.stdio[0]、 subprocess.stdio[1] 和 subprocess.stdio[2] 也分别可用作 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr;

  • subprocess.stdout 子进程的stdout的可读流,subprocess.stdout 是 subprocess.stdio[1] 的别名。 两个属性都将会指向相同的值;

3、通过fork产生的子进程与父进程可以用send即监听message来相互通信;
4、事件:error、close、message、exit、disconnect

  • close当子进程的stdio流已被关闭时会触发close事件;
  • disconnect断开连接,不再发送或接收消息;
  • error出现情况有4中:
    1)无法衍生进程;
    2)无法杀死进程;
    3)向子进程发送消息失败;
  • exit子进程结束后退出,但子进程的stdio流可能仍然是打开的;
  • message子进程使用process.send()发送消息时会触发message事件;

Nodejs之child_process相关推荐

  1. nodejs的child_process同步异步

    nodejs是一种单线程模型,但是,使用nodejs的child_process模块可以实现多进程任务.利用child_process可以创建子进程,实现子进程和主进程之间的通信. nodejs v0 ...

  2. NodeJS之child_process模块

    文章目录 1 Child Process 模块 1.1 简介 1.2 方法 1.2.1 exec() 1.2.2 execFile() 1.2.3 spawn() 1.2.4 fork() 1.2.5 ...

  3. 获取 NodeJS 程序退出码

    前言 想要退出正在运行的 NodeJS 程序,我们既可以通过 Ctrl + C 的方式,也可以通过process.exit()来执行退出. 这两种操作都将强制进程尽快退出,即使仍有未完全完成的异步操作 ...

  4. nodejs调用建行互联网银企被扫支付接口Java版加解密Demo

    环境:nodejs+eclipse+child_process模块+建行互联网银企被扫支付接口文档V2.2.6 总体步骤如下: 1.将建行Java版加密Demo打包成jar包:CCBParam.jar ...

  5. nodejs读取远程共享文件

    最近接到了一个任务,要在nodejs后台读取一个非本地的远程文件,经过一阵研究,找到了方法.发现网上对这件事的文章比较少,就写了一下方法. 1.将一个远程电脑上的文件夹设定为共享文件夹.在win10上 ...

  6. 关于node.js的web框架的应用及并发性能测试

    "Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样 ...

  7. 搭建前端私有npm杂记

    随着前端队伍越来越壮大,项目间共享代码就变得尤为重要.常用的框架/类库没必要在每个项目都放一份,团队内部产出的公共模块也需要有合理的共享机制.现在,用npm管理前端代码已经是业界趋势.楼主尝试用私有n ...

  8. 深入浅出实现Electron判断屏幕当前是否是双屏显示?

    如果在win10中设置双屏显示如下配置: 开启了双屏后,我们可以通过以下两种方式实现双屏显示的判断: 使用nodejs的child_process方式实现信息读取. // 方式一: 使用 wmic 以 ...

  9. shell中spawn什么意思_exec 和 spawn 的区别

    参考资料: 最近在用nodejs 的child_process 模块调用系统的shell脚本,但是发现遇到一些问题 child_process.exec 方法调用shell脚本发现内容过长会抛错 Er ...

最新文章

  1. 为什么redis取出来是null_跳表:为什么Redis一定要用跳表来实现有序集合
  2. leetcode617. 合并二叉树
  3. 网络中服务器是指为网络提供资源,并对这些资源进行管理的计算机,2016年职称计算机考试Internet冲刺试题及答案3...
  4. java发送post请求json格式_Linux QT 4G发送HTTP POST请求发送JSON格式的数据
  5. 674. Longest Continuous Increasing Subsequence最长连续递增子数组
  6. Java基础篇之什么是本机方法
  7. java泛型中的通配符 extends与super
  8. 微信小程序 会议室课堂考勤签到助手 源码
  9. 基于RFID和ZigBee室内定位技术原理浅析--室内定位--蓝牙定位--新导智能
  10. Spring-IoC注解
  11. Codeforces 524C Idempotent functions
  12. java看片_java – 如何正确查看片段
  13. linux commen cmd
  14. 岭南师范学院计算机考试考场,广东专插本考场安排在哪?附:2018年考场详细安排表~...
  15. Jmeter压力测试结果报告参数详解
  16. python简单笔试题_python编程简单笔试题
  17. UI设计教程分享:PS故障风海报制作教程
  18. DNA 4. SCI 文章中基因组的突变信号(maftools)
  19. 解决win10系统下Elasticsearch闪退问题
  20. C++ Lambda 表达式

热门文章

  1. WPF编程,使用系统自带的Wingdings字体。
  2. 单目相机提高标定精度的经验
  3. 首汽旗下「GoFun」:共享危机四伏,区块链是好的出路吗?
  4. 据说只有高端机器才配运行K8S,网友:1G内存的渣渣跑起来了!
  5. 老虎棒子鸡”试水有米iOS推荐墙,10天收入近5千元
  6. java操作txt文本(一):遇到指定字符换行
  7. 离线翻译软件【免费电脑版】
  8. 人才是最重要的资产,这类企业不可贸然裁员
  9. 计算机音乐锦鲤抄,锦鲤抄 MIDI File Download :: MidiShow
  10. 八大典型APT攻击过程详解