博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node的process以及child_process
阅读量:6831 次
发布时间:2019-06-26

本文共 4261 字,大约阅读时间需要 14 分钟。

在死磕进程一个礼拜后,终于把晦涩难懂文档看明白了,准备把自己的理解分享给大家,也希望大家能指出一些意见

进程的概念

  1. 在Node.js中每个应用程序都是一个进程类的实例对象。
  2. 使用process对象代表应用程序,这是一个全局对象,可以通过它来获取Node.jsy应用程序以及运行该程序的用户、环境等各种信息的属性、方法和事件。

进程中几个重要的属性

  1. stdin 标准输入可读流
  2. stdout 标准输入可写流
  3. stderr 标准错误输出流
  4. argv 终端输入参数数组
  5. env 操作系统环境信息
  6. pid 应用程序进程id

stdin以及stdout

process.stdin.on('data', (chunk) => {  process.stdout.write('进程接收到数据' + chunk)})复制代码

运行结果

argv

console.log(process.env)复制代码

env: 在mac终端输入 export NODE_ENV=develop

console.log(process.env.NODE_ENV) //develop复制代码

进程的方法

  1. process.memoryUsage() 查看内存使用信息
  2. process.nextTick() 当前eventloop执行完毕执行回调函数
  3. process.chdir() chdir方法用于修改Node.js应用程序中使用的当前工作目录
  4. process.cwd() 进程当前工作目录
  5. process.kill() 杀死进程
  6. process.uncaughtException() 当应用程序抛出一个未被捕获的异常时触发进程对象的uncaughtException事件
say() //方法不存在process.on('uncaughtException',function(err){  console.log('捕获到一个未被处理的错误:',err);});复制代码

child_process

子进程是今天要讲的重点,我也有一些不太明白,希望能和大家多多交流

child_process出现的背景

在Node.js中,只有一个线程执行所有操作,如果某个操作需要大量消耗CPU资源的情况下,后续操作都需要等待。

在Node.js中,提供了一个child_process模块,通过它可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程的互相通信来实现信息的交换。

spawn

语法:child_process.spawn(command, [args], [options])

  1. command 必须指定的参数,指定需要执行的命令
  2. args 数组,存放了所有运行该命令需要的参数
  3. options 参数为一个对象,用于指定开启子进程时使用的选项
const { spawn } = require('child_process')const path = require('path')let child1 = spawn('node', ['test1.js', 'yanyongchao'], {    stdio: ['pipe', 'pipe', 'pipe'], // 三个元素数组 下面会详解    cwd: __dirname, 子进程工作目录    env: process.env, 环境变量    detached: true // 如果为true,当父进程不存在时也可以独立存在})复制代码

其实上面都好理解除了sdtio数组,下面来一起分析stdio

stdio

stdio是一个数组,用来设置标准输入,标准输出,错误输出。个人理解

pipe:父进程和子进程之间建立一个管道

主进程代码

const path = require('path')const { spawn } = require('child_process')let p = spawn('node', ['childs_t.js'], {  cwd: path.join(__dirname, 'childs'),  stdio: ['pipe', 'pipe', process.stderr]})p.stdout.on('data', (data) => {  console.log(data.toString())}) // 这里用stdout原因: 子进程的数据流与常规理解的数据流方向相反,// stdin:写入流,stdout、stderr:读取流。复制代码

子进程代码

process.stdout.write('asd')复制代码

如果在stdio中放一个流,process.stdout,process.stdin

主进程代码

const { spawn } = require('child_process')const path = require('path')// 如果放的是一个流,则意味着父进程和子进程共享一个流const p = spawn('node', ['child_t.js'], {  cwd: path.join(__dirname, 'childs'),  stdio: [process.stdin, process.stdout, process.stderr]})复制代码

子进程代码

process.stdout.write('asd') //控制台会输出asd复制代码

ipc

主进程代码

const path = require('path')const { spawn } = require('child_process')let p = spawn('node', ['child_t.js'], {  cwd: path.join(__dirname, 'childs'),  stdio: ['ipc', 'pipe', 'pipe']})p.on('message', (msg) => {  console.log(msg)})p.send('hello chhild_process')复制代码

子进程代码

process.on('message', (msg) => {  process.send('子进程' + msg)})// child.send(message,[sendHandle]);//在父进程中向子进程发送消息// process.send(message,[sendHandle]);//在子进程中向主进程发送消息复制代码

detached模式

const { spawn } = require('child_process')const fs = require('fs')const path = require('path')let out = fs.openSync(path.join(__dirname, 'childs/msg.txt'), 'w', 0o666)let p = spawn('node', ['test4.js'], {  detached: true, //保证父进程结束,子进程仍然可以运行  stdio: 'ignore',  cwd: path.join(__dirname, 'childs')})p.unref()p.on('close', function() {  console.log('子进程关闭')})p.on('exit', function() {  console.log('子进程退出')})p.on('error', function(err) {  console.log('子进程1开启失败' + err)})复制代码

fork开启一个子进程

  1. 衍生一个新的 Node.js 进程,并通过建立一个 IPC 通讯通道来调用一个指定的模块,该通道允许父进程与子进程之间相互发送信息
  2. fork方法返回一个隐式创建的代表子进程的ChildProcess对象
  3. 子进程的输入/输出操作执行完毕后,子进程不会自动退出,必须使用process.exit()方法显式退出

子进程代码

const { fork } = require('child_process')const path = require('path')let child = fork(path.join(__dirname, 'childs/fork1.js'))child.on('message', (data) => {  console.log('父进程接收到消息' + data)})child.send('hello fork')child.on('error', (err) => {  console.error(err)})复制代码

子进程代码

process.on('message', (m, setHandle) => {  console.log('子进程接收到消息' + m)  process.send(m) //sendHandle是一个 net.Socket 或 net.Server 对象})复制代码

exec开启子进程

// exec同步执行一个shell命令let { exec } = require('child_process')let path = require('path')// 用于使用shell执行命令, 同步方法let p1 = exec('node exec.js a b c', {cwd: path.join(__dirname, 'childs')}, function(err, stdout, stderr) {  console.log(stdout)})复制代码

execFile开启子进程

let { execFile } = require('child_process')let path = require('path')let p1 = execFile('node', ['exec.js', 'a', 'b', 'c'], {  cwd: path.join(__dirname, 'childs')}, function(err, stdout, stderr) {  console.log(stdout)})复制代码

转载地址:http://einkl.baihongyu.com/

你可能感兴趣的文章
Dubbo的一次体验与分析
查看>>
工厂模式
查看>>
Linux系统安装初始化及优化脚本
查看>>
2FSK:Error: Unexpected MATLAB expression.
查看>>
SpringMVC + MyBatis整合
查看>>
远程桌面的开启和故障处理
查看>>
我的友情链接
查看>>
Linux 下 /dev/zero 和 /dev/null
查看>>
quartz定时任务时间设置
查看>>
我的友情链接
查看>>
Linux安装Mysql及常用操作
查看>>
java 面试
查看>>
Jboss集群session一致性
查看>>
Storm概念详解和工作原理,topology、spout、bolt的细节和API讲解之一
查看>>
高效编写Dockerfile的几条准则
查看>>
VCenter vSphere Client下为虚拟机添加VMTools过程详解
查看>>
VMware 12虚拟机中的系统启动后一直黑屏
查看>>
No enclosing instance of type错误
查看>>
后缀的意思
查看>>
管理 SELINUX
查看>>