Node.js創(chuàng)建子進(jìn)程的幾種實(shí)現(xiàn)方式
exec
其中exec可用于在指定的shell當(dāng)中執(zhí)行命令。
不同參數(shù)間使用空格隔開(kāi),可用于復(fù)雜的命令。
const { exec } = require('child_process') exec('cat *.js bad_file | wc -l')
exec方法用于異步創(chuàng)建一個(gè)新的子進(jìn)程,可以接受一個(gè)callback。
exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => { console.log(stdout) })
傳給回調(diào)的stdout和stderr參數(shù)會(huì)包含子進(jìn)程的stdout和stderr的輸出。
execFile
child_process.execFile(file[, args][, options][, callback])
const { execFile } = require('child_process') execFile('node', ['--version'], (err, stdout, stderr) => { console.log(stdout) })
不是直接衍生一個(gè)shell。
而是指定的可執(zhí)行的文件直接創(chuàng)建一個(gè)新的進(jìn)程。
fork
child_process.fork(modulePath[, args][, options])
創(chuàng)建一個(gè)新的node子進(jìn)程。調(diào)用該方法后返回一個(gè)子進(jìn)程的對(duì)象。
通過(guò)fork方法創(chuàng)建出來(lái)的子進(jìn)程可以和父進(jìn)程通過(guò)內(nèi)置的ipc通道進(jìn)行通訊。
衍生的 Node.js 子進(jìn)程與兩者之間建立的 IPC 通信信道的異常是獨(dú)立于父進(jìn)程的。
每個(gè)進(jìn)程都有自己的內(nèi)存,使用自己的 V8 實(shí)例。
由于需要額外的資源分配,因此不推薦衍生大量的 Node.js 進(jìn)程。
其中在options的配置信息當(dāng)中:
silent
父子進(jìn)程間stdin/stdout/stderr之間的通訊。
如果置為true,那么子進(jìn)程的標(biāo)準(zhǔn)輸入輸出都會(huì)被導(dǎo)流到父進(jìn)程中:
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')
一般在子進(jìn)程中如果有stdin的時(shí)候,可將stdin直接導(dǎo)入到父進(jìn)程中,這樣可進(jìn)行tty和shell的交互。
如果置為false,那么子進(jìn)程的標(biāo)準(zhǔn)輸入輸出都會(huì)繼承父進(jìn)程的。
stdio
關(guān)于這個(gè)的配置見(jiàn)下文。
spawn
child_process.spawn(command[, args][, options])
上面說(shuō)到的exec,execFile和fork創(chuàng)建新的子進(jìn)程都是基于這個(gè)方法進(jìn)行的封裝。
調(diào)用這個(gè)方法返回子進(jìn)程對(duì)象。
父子進(jìn)程間的通訊
其中通過(guò)fork方法和spawn創(chuàng)建新的子進(jìn)程時(shí),在配置選項(xiàng)中有關(guān)于stdio的?字段:
這個(gè)字段主要用于父子進(jìn)程間的管道配置。
默認(rèn)情況下,子進(jìn)程的 stdin、 stdout 和 stderr 會(huì)重定向到 ChildProcess 對(duì)象上相應(yīng)的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流。
這等同于將 options.stdio 設(shè)為 ['pipe', 'pipe', 'pipe']。
pipe
:等同于 [pipe, pipe, pipe] (默認(rèn))ignore
:等同于 [ignore, ignore, ignore]inherit
:等同于 [process.stdin, process.stdout, process.stderr] 或 [0,1,2]
其中inherit即繼承父進(jìn)程的標(biāo)準(zhǔn)輸入輸出(和父進(jìn)程共享)。
const { spawn } = require('child_process'); // 子進(jìn)程使用父進(jìn)程的 stdios spawn('prg', [], { stdio: 'inherit' }); // 衍生的子進(jìn)程只共享 stderr spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] }); // 打開(kāi)一個(gè)額外的 fd=4,用于與程序交互 spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
sharp.js安裝過(guò)程中遇到的問(wèn)題總結(jié)
本文給大家講述的是Node.js服務(wù)端圖片處理利器sharp.js安裝過(guò)程中遇到的問(wèn)題的匯總,非常不錯(cuò),有需要的小伙伴可以參考下2020-04-04對(duì)node通過(guò)fs模塊判斷文件是否是文件夾的實(shí)例講解
今天小編就為大家分享一篇對(duì)node通過(guò)fs模塊判斷文件是否是文件夾的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06npm安裝sharp出現(xiàn)的問(wèn)題詳解(安裝失敗的問(wèn)題及解決)
這篇文章主要給大家介紹了關(guān)于npm安裝sharp出現(xiàn)的問(wèn)題(安裝失敗的問(wèn)題及解決)的相關(guān)資料,sharp包是基于node.js的高性能圖片處理器,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11詳解IWinter 一個(gè)路由轉(zhuǎn)控制器的 Nodejs 庫(kù)
本篇文章主要介紹了詳解IWinter 一個(gè)路由轉(zhuǎn)控制器的 Nodejs 庫(kù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11如何在Node.js中使用async函數(shù)的方法詳解
這篇文章主要為大家介紹了如何在Node.js中使用async函數(shù)的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解如何在Node.js中執(zhí)行CPU密集型任務(wù)
Node.js通常被認(rèn)為不適合CPU密集型應(yīng)用程序,Node.js的工作原理使其在處理I/O密集型任務(wù)時(shí)大放異彩,雖然執(zhí)行CPU密集型任務(wù)肯定不是Node的主要使用場(chǎng)景,但是我們依舊有方法來(lái)改善這些問(wèn)題,本文詳細(xì)給大家介紹了如何在Node.js中執(zhí)行CPU密集型任務(wù)2023-12-12