node.js之process和child_process

process

process.env

// NODE_ENV=production node app.js
// NODE_ENV=dvelopment node app.js
if(process.env.NODE_ENV === 'production'){
    console.log('生產(chǎn)環(huán)境');
}else{
    console.log('非生產(chǎn)環(huán)境');
}

process.nextTick(fn)

  1. process.nextTick將放在node事件循環(huán)的下次tick中
  2. process.nextTick(fn)比setTimeout的性能要更高
// 執(zhí)行結(jié)果:  s1  s2   ss
console.log('s1');
process.nextTick(function(){
    console.log('ss');
});
console.log('s2');

process.argv
即獲取命令行:node + 文件 + 參數(shù), 如下:

// NODE_ENV=development node argv.js  --env production
process.argv.forEach(function(val, index, array) {
  console.log('參數(shù)' + index + ': ' + val);
});
// 參數(shù)傳入env為production,但更改process.env.NODE_ENV為development

process.cwd()\process.chdir()

// 獲取當(dāng)前路徑
console.log('Starting directory: ' + process.cwd());
try {
// 切換到tmp下,沒有即創(chuàng)建
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}catch (err) {
  console.log('chdir: ' + err);
}

process.connect()與process.disconnect()

var child_process = require('child_process');

child_process.fork('./connectedChild.js', {
  stdio: 'inherit'
});
// connectedChild.js
console.log( 'process.connected: ' + process.connected );
process.disconnect();
console.log( 'process.connected: ' + process.connected );

// 輸出:
// process.connected: true
// process.connected: false

標(biāo)準(zhǔn)輸入輸出信息和錯(cuò)誤信息的處理 process.stdin、process.stdout、process.stderr

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write(`data: ${chunk}`);
  }
});

process.stdin.on('end', () => {
  process.stdout.write('end');
});

系統(tǒng)相關(guān)信息

  • 運(yùn)行情況/資源占用情況: process.uptime()、process.memoryUsage()
  • 進(jìn)程信息: process.pid\title
  • 用戶/組信息:process.seteuid(id)、 process.geteuid().........
  • 環(huán)境信息: process. platform:返回關(guān)于平臺(tái)描述的字符串,比如 darwin、win32 等。
  • 處理器信息: process.arch: 返回當(dāng)前系統(tǒng)的處理器架構(gòu)(字符串),比如'arm', 'ia32', or 'x64'。
子進(jìn)程相關(guān)功能
const spawn = async (...args) => {
  const { spawn } = require('child_process');
  return new Promise(resolve => {
    const proc = spawn(...args)
    proc.stdout.pipe(process.stdout)
    proc.stderr.pipe(process.stderr)
    proc.on('close', () => {
      resolve()
    })
  })
}
// 執(zhí)行spawn('npm', ['install'], { cwd: `./${name}` })

1.exec - child_process.exec 使用子進(jìn)程執(zhí)行命令,緩存子進(jìn)程的輸出,并將子進(jìn)程的輸出以回調(diào)函數(shù)參數(shù)的形式一次性返回。exec方法會(huì)從子進(jìn)程中返回一個(gè)完整的buffer。默認(rèn)情況下,這個(gè)buffer的大小應(yīng)該是200k。如果子進(jìn)程返回的數(shù)據(jù)大小超過了200k,程序?qū)?huì)崩潰,同時(shí)顯示錯(cuò)誤信息“Error:maxBuffer exceeded”。你可以通過在exec的可選項(xiàng)中設(shè)置一個(gè)更大的buffer體積來解決這個(gè)問題,但是你不應(yīng)該這樣做,因?yàn)閑xec本來就不是用來返回很多數(shù)據(jù)的方法。

2.spawn - child_process.spawn 使用指定的命令行參數(shù)創(chuàng)建新進(jìn)程。spawn 會(huì)返回一個(gè)帶有stdout和stderr流的對(duì)象。你可以通過stdout流來讀取子進(jìn)程返回給Node.js的數(shù)據(jù)。stdout擁有’data’,’end’以及一般流所具有的事件。當(dāng)你想要子進(jìn)程返回大量數(shù)據(jù)給Node時(shí),比如說圖像處理,讀取二進(jìn)制數(shù)據(jù)等等,你最好使用spawn方法。

3.fork - child_process.fork 是 spawn()的特殊形式,用于在子進(jìn)程中運(yùn)行的模塊,如 fork(‘./son.js’) 相當(dāng)于 spawn(‘node’, [‘./son.js’]) 。與spawn方法不同的是,fork會(huì)在父進(jìn)程與子進(jìn)程之間,建立一個(gè)通信管道,通過process.send和on("message")通信。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容