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