Node.js創(chuàng)建子進程的幾種實現(xiàn)方式
exec
其中exec可用于在指定的shell當中執(zhí)行命令。
不同參數(shù)間使用空格隔開,可用于復雜的命令。
const { exec } = require('child_process') exec('cat *.js bad_file | wc -l')
exec方法用于異步創(chuàng)建一個新的子進程,可以接受一個callback。
exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => { console.log(stdout) })
傳給回調的stdout和stderr參數(shù)會包含子進程的stdout和stderr的輸出。
execFile
child_process.execFile(file[, args][, options][, callback])
const { execFile } = require('child_process') execFile('node', ['--version'], (err, stdout, stderr) => { console.log(stdout) })
不是直接衍生一個shell。
而是指定的可執(zhí)行的文件直接創(chuàng)建一個新的進程。
fork
child_process.fork(modulePath[, args][, options])
創(chuàng)建一個新的node子進程。調用該方法后返回一個子進程的對象。
通過fork方法創(chuàng)建出來的子進程可以和父進程通過內置的ipc通道進行通訊。
衍生的 Node.js 子進程與兩者之間建立的 IPC 通信信道的異常是獨立于父進程的。
每個進程都有自己的內存,使用自己的 V8 實例。
由于需要額外的資源分配,因此不推薦衍生大量的 Node.js 進程。
其中在options的配置信息當中:
silent
父子進程間stdin/stdout/stderr之間的通訊。
如果置為true,那么子進程的標準輸入輸出都會被導流到父進程中:
parent.js const { fork } = require('child_process') const fd = fork('./sub.js') fd.stdout.on('data', data => console.log(data)) sub.js console.log('this is sub process')
一般在子進程中如果有stdin的時候,可將stdin直接導入到父進程中,這樣可進行tty和shell的交互。
如果置為false,那么子進程的標準輸入輸出都會繼承父進程的。
stdio
關于這個的配置見下文。
spawn
child_process.spawn(command[, args][, options])
上面說到的exec,execFile和fork創(chuàng)建新的子進程都是基于這個方法進行的封裝。
調用這個方法返回子進程對象。
父子進程間的通訊
其中通過fork方法和spawn創(chuàng)建新的子進程時,在配置選項中有關于stdio的?字段:
這個字段主要用于父子進程間的管道配置。
默認情況下,子進程的 stdin、 stdout 和 stderr 會重定向到 ChildProcess 對象上相應的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流。
這等同于將 options.stdio 設為 ['pipe', 'pipe', 'pipe']。
pipe
:等同于 [pipe, pipe, pipe] (默認)ignore
:等同于 [ignore, ignore, ignore]inherit
:等同于 [process.stdin, process.stdout, process.stderr] 或 [0,1,2]
其中inherit即繼承父進程的標準輸入輸出(和父進程共享)。
const { spawn } = require('child_process'); // 子進程使用父進程的 stdios spawn('prg', [], { stdio: 'inherit' }); // 衍生的子進程只共享 stderr spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] }); // 打開一個額外的 fd=4,用于與程序交互 spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
npm安裝sharp出現(xiàn)的問題詳解(安裝失敗的問題及解決)
這篇文章主要給大家介紹了關于npm安裝sharp出現(xiàn)的問題(安裝失敗的問題及解決)的相關資料,sharp包是基于node.js的高性能圖片處理器,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11如何在Node.js中使用async函數(shù)的方法詳解
這篇文章主要為大家介紹了如何在Node.js中使用async函數(shù)的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12