nodeJS内置模块-进程及相关

本文介绍了Node.js中的child_process模块,包括fork、spawn方法用于创建子进程,详细讲解了子进程的参数设置如execPath、stdio,以及进程间的通信和错误处理。示例代码展示了如何在master.js和child-process.js之间发送消息并管理进程。
摘要由CSDN通过智能技术生成

master.js文件,主进程


// child_process.fork(modulePath[, args][, options])
// modulePath:子进程运行的模块。

// 参数说明:(重复的参数说明就不在这里列举)

// execPath: 用来创建子进程的可执行文件,默认是/usr/local/bin/node。也就是说,你可通过execPath来指定具体的node可执行文件路径。(比如多个node版本)
// execArgv: 传给可执行文件的字符串参数列表。默认是process.execArgv,跟父进程保持一致。
// silent: 默认是false,即子进程的stdio从父进程继承。如果是true,则直接pipe向子进程的child.stdin、child.stdout等。
// stdio: 如果声明了stdio,则会覆盖silent选项的设置。

const child_process = require('node:child_process')
const spawn = require('node:child_process').spawn

// 执行一次
// child_process.fork('child-process.js', {
//   silent: false
// })

// 实例化不执行
const child = child_process.fork('child-process.js', {
  silent: false,
  // stdio: 'ignore'
})

console.log('master.js')

child.on('message', data => {
  console.log('from child-process data: %s', data)
})

child.send({from: 'i am master.js'})


// exec() -> execFile() -> spawn()
/* 
Class: ChildProcess
通过child_process.spawn()等创建,一般不直接用构造函数创建。
继承了EventEmitters,所以有.on()等方法。
*/
console.log('master env params: ', process.execArgv)
console.log('master env params: ', process.argv)

/*
node --harmony --test2 hjj 
harmony:node特有参数
master env params:  [ '--harmony' ]
master env params:  [
  'D:\\soft\\nodeJS\\node.exe',
  'D:\\www\\my-demo\\node-demo\\master.js',
  '--test2',
  'hjj'
]
*/
setTimeout(() => {
  // 主动退出
  // child.unref();
}, 6000);

console.log('process.pid: %d', process.pid)

// 可以用它来修改进程的名字,当你用ps命令,同时有多个node进程在跑的时候,作用就出来了。
process.title = 'test node'
console.log('process.title: %s', process.title)

// 查看资源占用

console.log('memoryUsage: ', JSON.stringify(process.memoryUsage(), null, 2))

// cpu耗时
// CPU使用时间耗时,单位为毫秒。user表示用户程序代码运行占用的时间,system表示系统占用时间。如果当前进程占用多个内核来执行任务,那么数值会比实际感知的要大
const startUsage = process.cpuUsage()
console.log('startUsage', startUsage)
const now = Date.now();
while (Date.now() - now < 500);
console.log('cpu:', process.cpuUsage(startUsage))

/* process.hrtime():一般用于做性能基准测试。返回一个数组,数组里的值为 [[seconds, nanoseconds] (1秒等10的九次方毫微秒)。
注意,这里返回的值,是相对于过去一个随机的时间,所以本身没什么意义。仅当你将上一次调用返回的值做为参数传入,才有实际意义。 */

// var time = process.hrtime();
// const t = setInterval(() => {
//   var diff = process.hrtime(time);
//   console.log(`Benchmark took ${diff[0] * 1e9 + diff[1]} nanoseconds`);
//   console.log(`Benchmark took ${diff[0] + diff[1]} nanoseconds`);
// }, 1000);
// setTimeout(clearInterval, 4000, t)

// 依赖库
console.log('process.versions:', process.versions)

console.log('hello');

process.on('SIGHUP', (err, data) => {
  console.log('SIGHUP err', err);
  process.nextTick(() => {
    console.log('Got SIGHUP signal.');
  })
});
setTimeout(() => {
  process.kill(process.pid, 'SIGHUP');
}, 3000)
console.log('world');

// process.channel


child-process.js 子进程

const spawn = require('node:child_process').spawn;
// const AbortController = require('node');
/* 
  spawn
    exec
    execFile
    fork
  cwd:当前工作路径。
  env:环境变量。
  encoding:编码,默认是utf8。
  shell:用来执行命令的shell,unix上默认是/bin/sh,windows上默认是cmd.exe。
  timeout:默认是0。
  killSignal:默认是SIGTERM。
  uid:执行进程的uid。
  gid:执行进程的gid。
  maxBuffer: 标准输出、错误输出最大允许的数据量(单位为字节),如果超出的话,子进程就会被杀死。默认是200*1024(就是200k啦)
  
  如果timeout大于0,那么,当子进程运行超过timeout毫秒,那么,就会给进程发送killSignal指定的信号(比如SIGTERM)。
  如果运行没有出错,那么error为null。如果运行出错,那么,error.code就是退出代码(exist code),error.signal会被设置成终止进程的信号。(比如CTRL+C时发送的SIGINT)

  传入的命令,如果是用户输入的,有可能产生类似sql注入的风险
*/
const exec = require('child_process').exec;
const execFile = require('child_process').execFile;

// exec('dir', (err, ret) => {
//   if(err) {
//     return console.log(err)
//   }
//   process.nextTick(() =>{
//     console.dir(ret.toString('utf8'))
//   })
// });
// const Abort = new AbortController()
// const { signal } = controller
execFile('node', ['--version'], (err, data) => {
  if (err) {
    console.log(err);
  }
  console.log('execFile: %s', data)
})

// Abort.abort()

console.log(global.AbortController)

console.log('program end')


// 只能被fork调用,不能单独执行,不然报错
// 当fork进程和子进程同时发送消息时,fork会被挂起,监听子进程是否继续发送消息。
process.on('message', data => {
  console.log('from master data: %s', data);
})

process.send({from: 'i am child-process.js'})


/* 场景1:命令本身不存在,创建子进程报错。
场景2:命令存在,但运行过程报错。
 */
const badCommand = spawn('bad_command');

// 监听到报错
badCommand.on('error', (err) => {
  console.log('Failed to start child process 1.');
});

// window环境报错
const ls = spawn('node', ['--version'], {
  stdio: 'inherit',
  detached: true,
  shell: true, // window下会弹出窗口然后消失
  // stdio: 'ignore' // 
})

ls.on('close', code => {
  console.log('code: ', code) // 1
})

console.log('child env params: ', process.execArgv)

console.log('process.connected', process.connected)

// setTimeout(() => {
//   // 断开与master的链接
//   process.disconnect()
//   console.log('process.disconnected')
//   console.log('process.connected', process.connected)
// }, 6000)

参考: https://www.bookstack.cn/read/nodejs-learning-guide/%E6%A8%A1%E5%9D%97-cluster.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值