天天看點

nodejs的多程序管理子產品child_process

  child_process是Node.js的一個十分重要的模塊,通過它可以實現創建多進程,以利用多核計算資源,同時友善管理各個子子產品程序。

  Node.js 0.8的child_process模塊提供了四個創建子進程的函數,分別是spawn,exec,execFile和fork。其中spawn是最原始的創建子進程的函數,其他三個都是對spawn不同程度的封裝。spawn隻能運行指定的程式,參數需要在清單中給出,相當於execvp系統函數,而exec可以直接運行複雜的指令。

看下面spawn與exec的差異:

execFile與spawn的參數相似,也需要分別指定執行的指令和參數,但可以接受一個回調函數,與exec的回調函數相同。它與exec的區別在於不啓動獨立的shell,是以相比更加輕量級。

fork函數用於直接運行Node.js模塊,例如fork(‘./child.js’),相當於spawn(‘node’, ['./child.js'])。與默認的spawn不同的是,fork會在父進程與子進程直接建立一個IPC管道,用於父子進程之間的通信。例如:

child.js的内容:

其中父進程調用fork函數獲取一個傳回值,作爲子進程的句柄,通過send函數發送資訊,on(‘message’)監聽傳回的資訊,子進程通過內置的process對象相同的方法與父進程通信。

fork函數有一個問題,就是它隻能運行JavaScript代碼,如果你喜歡用CoffeeScript(或者其他任何編譯到js的語言),是無法通過fork調用的。一個簡單的方法是把代碼編譯到JavaScript再運行,但是很不友善,有沒有什麼辦法呢?答案是可以的,還是得回到spawn函數。spawn函數除了接受command, args外,還接受一個options參數。通過把options參數的stdio設爲['ipc'],即可在父子進程之間建立IPC管道。例如子進程使用CoffeeScript:

其中隻要把spawn的第一個參數設置爲運行對應腳本的解釋器,即可運行,例如使用Continuation.js,隻需child = child_process.spawn(‘continuation’, ['./child.coffee'], options)。

轉載來源傳送門

繼續閱讀