node的process以及child_process模块学习笔记

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

进程的概念

  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模块,通过它可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程的互相通信来实现信息的交换。

child_process模块给予node任意创建子进程的能力,node官方文档对于child_proces模块给出了四种方法,映射到操作系统其实都是创建子进程。但对于开发者而已,这几种方法的api有点不同

child_process.exec(command[, options][, callback]) 启动
子进程来执行shell命令,可以通过回调参数来获取脚本shell执行结果

child_process.execfile(file[, args][, options][, callback])
与exec类型不同的是,它执行的不是shell命令而是一个可执行文件

child_process.spawn(command[, args][, options])仅仅执行一个shell命令,不需要获取执行结果

child_process.fork(modulePath[, args][, options])可以用node
执行的.js文件,也不需要获取执行结果。fork出来的子进程一定是node进程

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)
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解node child_process模块学习笔记
  • 详解从Node.js的child_process模块来学习父子进程之间的通信
  • Node.js中child_process实现多进程
  • 利用NodeJS的子进程(child_process)调用系统命令的方法分享
(0)

相关推荐

  • Node.js中child_process实现多进程

    复制代码 代码如下: var http = require('http'); function fib (n) {     if (n < 2) {         return 1;     } else {         return fib(n - 2) + fib(n - 1);     } } var server = http.createServer(function (req, res) {     var num = parseInt(req.url.substring(1)

  • 详解从Node.js的child_process模块来学习父子进程之间的通信

    child_process模块提供了和popen(3)一样的方式来产生自进程,这个功能主要是通过child_process.spawn函数来提供的: const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data'

  • 详解node child_process模块学习笔记

    NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行.当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞.但单进程也有个问题就是不能充分利用CPU的多核机制,根据前人的经验,可以通过创建多个进程来充分利用CPU多核,并且Node通过了child_process模块来创建完成多进程的操作. child_process模块给予node任意创建子进程的能力,node官方文档对于child_proces模块给出了四种方法,映射到操作系统其实都是创建子进程

  • 利用NodeJS的子进程(child_process)调用系统命令的方法分享

    NodeJS子进程简介 NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入.标准输出及标准错误输出的接口. NodeJS子进程简介 NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 标准输入.标准输出及标准错误输出的接口 child.stdin 获取标准输入 child.stdout 获取标准输出 child.stderr 获取标准错误输出 获取子进程的PID:child.pid 提供生成子进程的重要方法:child_process.spawn(cmd,

  • node的process以及child_process模块学习笔记

    在死磕进程一个礼拜后,终于把晦涩难懂文档看明白了,准备把自己的理解分享给大家,也希望大家能指出一些意见 进程的概念 在Node.js中每个应用程序都是一个进程类的实例对象. 使用process对象代表应用程序,这是一个全局对象,可以通过它来获取Node.jsy应用程序以及运行该程序的用户.环境等各种信息的属性.方法和事件. 进程中几个重要的属性 stdin 标准输入可读流 stdout 标准输入可写流 stderr 标准错误输出流 argv 终端输入参数数组 env 操作系统环境信息 pid 应

  • Node.js中的child_process模块详解

    前言 本文主要给大家介绍了关于Node.js中child_process模块的相关内容,在介绍child_process模块之前,先来看一个例子. const http = require('http'); const longComputation = () => { let sum = 0; for (let i = 0; i < 1e10; i++) { sum += i; }; return sum; }; const server = http.createServer(); ser

  • Python logging模块学习笔记

    模块级函数 logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root loggerlogging.debug().logging.info().logging.warning().logging.error().logging.critical():设定root logger的日志级别logging.basicConfig():用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中 示例

  • Python中Random和Math模块学习笔记

    由于最近经常使用到Python中random,math和time``datetime模块, 所以决定花时间系统的学习一下 1. math模块 math中的函数不可以用于太过复杂的数的运算, 如果需要复杂数的运行最好使用cmath模块中同名函数, 如果想要更加高级的数学功能,可以考虑选择标准库之外的numpy和scipy模块,它们不但支持数组和矩阵运算,还有丰富的数学和物理方程可供使用 1.1. 数学常量 math.pi 这个数学常量等于 3.141592... math.e 这个数学常量 e =

  • Python os模块学习笔记

    一.os模块概述 Python os模块包含普遍的操作系统功能.例如文件的复制.创建.修改.删除文件及文件夹... 二.常用方法 1.os.listdir()   返回指定目录下的所有文件和目录名. 2.os.remove()  删除一个文件. 3.os.system()  运行shell命令. 4.os.path.split()   函数返回一个路径的目录名和文件名 5.os.path.isfile()和os.path.isdir()   函数分别检验给出的路径是一个文件还是目录,返回值分别为

  • Python tempfile模块学习笔记(临时文件)

    tempfile.TemporaryFile 如何你的应用程序需要一个临时文件来存储数据,但不需要同其他程序共享,那么用TemporaryFile函数创建临时文件是最好的选择.其他的应用程序是无法找到或打开这个文件的,因为它并没有引用文件系统表.用这个函数创建的临时文件,关闭后会自动删除. 实例一: 复制代码 代码如下: import osimport tempfile print 'Building a file name yourself:'filename = '/tmp/guess_my

  • AngularJS模块学习之Anchor Scroll

    俗话说的好:好记性不如一个烂笔头,本文对angularjs模块学习笔记,首先我们从anchor scroll开始学习,具体内容请看下文: •$anchorScroll()用于跳转至定义ID: •$location对象的hash()方法会替换当前url作为hash键: •$anchorScroll()读取并跳转至ID处. 下面简单的例子,这里是输出结果: 源码 index.html--11行,标示了的跳转ID: <!DOCTYPE html> <html ng-app="app&

  • 详解阿里Node.js技术文档之process模块学习指南

    模块概览 process是node的全局模块,作用比较直观.可以通过它来获得node进程相关的信息,比如运行node程序时的命令行参数.或者设置进程相关信息,比如设置环境变量. 环境变量:process.env 使用频率很高,node服务运行时,时常会判断当前服务运行的环境,如下所示 if(process.env.NODE_ENV === 'production'){ console.log('生产环境'); }else{ console.log('非生产环境'); } 运行命令 NODE_EN

随机推荐