NodeJs之child_process


 

一.child_process


child_process是NodeJs的重要模塊。幫助我們創建多進程任務,更好的利用了計算機的多核性能。

當然也支持線程間的通信。

 

二.child_process的幾個API


異步:

child_process.exec(command[, options][, callback])

child_process.execFile(file[, args][, options][, callback])

child_process.fork(modulePath[, args][, options])

child_process.spawn(command[, args][, options])

同步:

child_process.execFileSync(file[, args][, options])

child_process.execSync(command[, options])

child_process.spawnSync(command[, args][, options])

事件:

Event: 'close'

Event: 'disconnect'

Event: 'error'

Event: 'exit'

Event: 'message'

 

三.child_process.spawn(command[, args][, options])


command:只執行的命令

args:參數列表

options:環境變量

先用一下:查詢磁盤大小

var child_process = require('child_process'); var spawn = child_process.spawn; var wmic = spawn('wmic', ['DiskDrive', 'get', 'Size', '/value']); wmic.stdout.on('data', function(data) { console.log('使用spawn方法輸出: ' + data); }); wmic.stderr.on('data', function(data) { console.log('stderr: ' + data); }); wmic.on('close', function(code) { console.log('child process exited with code ' + code); });

上面的命令在cmd中:wmic DiskDrive get Size /value

Node 通過 child_process 模塊提供了類似 popen(3) 的處理三向數據流(stdin/stdout/stderr)的功能。

spawn()與exec(),execFile()的區別是:后兩個創建時可以指定timeout屬性設置超時時間,一旦創建的進程運行超過設定的時間將會被kill。

 

四.child_process.exec(command[, options][, callback])


exec添加了對shell命令的解析,可以執行復雜的命令。不需要像spawn一樣分開寫參數。並且有一個回調。

直接使用:wmic DiskDrive get Size /value

var child_process = require('child_process'); var exec = child_process.exec; exec('wmic DiskDrive get Size /value', function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); return; } console.log('使用exec方法輸出: '+stdout); console.log(`stderr: ${stderr}`); });

如果沒出錯,error參數為null,退出碼為0.只要不為0,就出錯。

 

五.child_process.execFile(file[, args][, options][, callback])


不執行shell.

使用:

var execFile = require('child_process').execFile; var child = execFile('node', ['--version'], (error, stdout, stderr) => { if (error) { throw error; } console.log(stdout); });

 

六.child_process.fork(modulePath[, args][, options])


不同於spawn,fork函數會在進程間建立通訊通道。

使用:父子進程的通信。這個經常使用!

parent.js

//主進程
var childProcess = require('child_process'); var child = childProcess.fork('./child.js'); //接受來自子進程的消息
n.on('message', function(msg) { console.log('來自子進程的消息: ', msg); }); //發送消息給子(fork)進程
n.send({ hello: 'zqz' });

 

child.js

//子進程 //接受來自父進程的消息
process.on('message', function(msg) { console.log('收到父進程的消息:', msg); }); //向父進程發送消息
process.send({ Hello: 'Mr.zhao' });

 

七.close 事件


“關閉”事件在會在所有stdio流子進程關閉時候觸發。這是有別於“退出”的事件,因為多個進程可以共享相同的stdio流。

 

八.disconnect 事件


在子進程或父進程中使用使用.disconnect()方法后,這個事件會被觸發,在斷開之后,就不可能再相互發送信息了。

可以通過檢查子進程的child.connected屬性是否為true去檢查是否可以發送信息。

 

九.error 事件


觸發的條件:

1.進程不能被創建, 或者

2.進程不能被終止掉, 或者

3.由任何原因引起的數據發送到子進程失敗.

 

十.exit 事件


這個事件是在子進程被結束的時候觸發的. 假如進程被正常結束,‘code’就是退出進程的指令代碼, 否則為'null'. 假如進程是由於接受到signal結束的, signal 就代表着信號的名稱, 否則為null.

 

十一.message 事件


通過.send()發送的信息可以通過監聽'message'事件獲取到。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM