NodeJS多進程

NodeJS多進程

Node以單線程的方式運行,經過事件驅動的方式來減小開銷車,處理併發。咱們能夠註冊多進程,而後監聽子進程的事件來實現併發javascript

簡介

Node提供了child_process模塊來處理子進程,有三種形式java

  • exec:直接在terminal裏面開啓進程
  • spawn:指定命令+參數
  • fork:與spawn相似,默認node執行,而且父子間創建通訊管道,能夠實現進程間通訊

exec

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:

spawn

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版本一致併發

fork

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

相關文章
相關標籤/搜索