Node以單線程的方式運行,經過事件驅動的方式來減小開銷車,處理併發。咱們能夠註冊多進程,而後監聽子進程的事件來實現併發javascript
Node提供了child_process模塊來處理子進程,有三種形式java
slave.jsnode
var f = function(){ // process全局能夠得到當前進程的信息 console.log("進程", process.argv[2] + "執行結束") } // 延遲運行,現node的註冊機制和併發 setTimeout(f, 1000*(3-process.argv[2]));
master.jsbash
const child_process = require('child_process') for (var id = 0; id<3; id++){ // 開啓子進程,並處理輸出 var subProcess = child_process.exec('node slave.js '+id,function (error, stdout, stderr) { if (error){ console.error(error) } else{ console.log('stdout: '+stdout) console.log('stderr: '+stderr) } }) // 監聽三個進程 subProcess.on('exit',function (code) { console.log("子進程已經退出 "+code) //打印退出碼 }) }
子進程已經退出 0 stdout: 進程 2執行 stderr: 子進程已經退出 0 stdout: 進程 1執行 stderr: 子進程已經退出 0 stdout: 進程 0執行 stderr:
const child_process = require('child_process') for (var id = 0; id<3; id++){ // 開啓子進程,並處理輸出,這種傳參方式更加規整一些 var subProcess = child_process.spawn('node', ['slave.js', id]) // 監聽流 subProcess.stdout.on('data',function (data) { console.log('stdout: '+data) }) subProcess.stderr.on('data',function (data) { console.log('stderr: '+data) }) // 監聽三個進程 subProcess.on('exit',function (code) { console.log("子進程已經退出 "+code) //打印退出碼 }) }
運算結果與exec版本一致併發
const child_process = require('child_process') for (var id = 0; id<3; id++){ // 開啓子進程,並處理輸出 var subProcess = child_process.fork('slave.js', [id]) // 監聽三個進程 subProcess.on('exit',function (code) { console.log("子進程已經退出 "+code) //打印退出碼 }) }
運算結果ui
進程 2執行結束 子進程已經退出 0 進程 1執行結束 子進程已經退出 0 進程 0執行結束 子進程已經退出 0
值得注意的是,fork的子進程輸出內容輸出在父進程的同一個terminal中spa