一:child_process child_process是NodeJs的重要模塊。幫助我們創建多進程任務,更好的利用了電腦的多核性能。 當然也支持線程間的通信。 二:child_process的幾個API 非同步: child_process.exec(command[, options][, c ...
一: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)的功能。
四: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'事件獲取到。