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