NodeJs之child_process

 

一.child_processnode


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

固然也支持線程間的通訊。異步

 

二.child_process的幾個API函數


異步:性能

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

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

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

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

同步:blog

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'事件獲取到。

相關文章
相關標籤/搜索