Node.js創(chuàng)建子進(jìn)程的幾種實(shí)現(xiàn)方式
exec
其中exec可用于在指定的shell當(dāng)中執(zhí)行命令。
不同參數(shù)間使用空格隔開,可用于復(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)程的對象。
通過fork方法創(chuàng)建出來的子進(jìn)程可以和父進(jìn)程通過內(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è)的配置見下文。
spawn
child_process.spawn(command[, args][, options])
上面說到的exec,execFile和fork創(chuàng)建新的子進(jìn)程都是基于這個(gè)方法進(jìn)行的封裝。
調(diào)用這個(gè)方法返回子進(jìn)程對象。
父子進(jìn)程間的通訊
其中通過fork方法和spawn創(chuàng)建新的子進(jìn)程時(shí),在配置選項(xiàng)中有關(guān)于stdio的?字段:
這個(gè)字段主要用于父子進(jìn)程間的管道配置。
默認(rèn)情況下,子進(jìn)程的 stdin、 stdout 和 stderr 會(huì)重定向到 ChildProcess 對象上相應(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] });
// 打開一個(gè)額外的 fd=4,用于與程序交互
spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
干凈卸載Windows的Node.js環(huán)境的方法
這篇文章主要介紹了如何干凈卸載Windows的Node.js環(huán)境的方法,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家刪除Node.js環(huán)境有一定的幫助,需要的朋友可以參考下2025-01-01
基于Node.js進(jìn)行CSV、JSON以及Excel的數(shù)據(jù)處理
在實(shí)際業(yè)務(wù)開發(fā)中,數(shù)據(jù)往往以多種文件格式存在,例如 CSV、JSON 和 Excel,這些格式廣泛應(yīng)用于數(shù)據(jù)導(dǎo)入導(dǎo)出、報(bào)表生成、系統(tǒng)對接以及批量處理任務(wù)中,Node.js 憑借豐富的第三方庫和良好的異步能力,非常適合進(jìn)行各類結(jié)構(gòu)化數(shù)據(jù)的處理,需要的朋友可以參考下2025-12-12
推薦 21 款優(yōu)秀的高性能 Node.js 開發(fā)框架
Node.js是JavaScript中最為流行的框架之一,易于創(chuàng)建可擴(kuò)展的Web應(yīng)用。Node.js包含不同類型框架,包括MVC, full-stack,REST API以及Generators。借助這些框架使Node.js更加易于使用,它還支持眾多特性功能,只需幾個(gè)步驟就可快速搭建強(qiáng)大的Web應(yīng)用。本文為大家推薦21款2014-08-08
visual studio配置node.js開發(fā)的圖文教程
在進(jìn)行node開發(fā)時(shí),使用visual studio作為開發(fā)工具是非常常見的選擇,本文主要介紹了visual studio配置node.js開發(fā)的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05

