天天看點

Node.js程序管理之子程序

一、理論

這兩天感情生活不順利,想遇到對的人真的很難,可能因為各種條件無法讓兩人在一起,友誼的小船說翻就翻,對于在感情這塊比較白癡的我真心煩。可能也就隻有部落格能打發我的業餘時間。之前看多程序這一章節時發現這塊東西挺多,寫process子產品的時候也有提到,今天下午午休醒來靜下心來好好的看了一遍,發現也不是太難了解。

node.js是單線程的,對于現在普遍是多處理器的機器是一種浪費,怎麼能利用起來呢?于是child_process子產品出現了。child_process子產品可以在其他程序上産生、派生,并執行工作。

child_process子產品提供了一個childprocess的新類,它可以作為從父程序通路子程序的表示形式。process子產品也是childprocess對象。當你從父子產品通路process時,它是父childprocess對象,當你從子程序通路process是,它是childprocess對象

了解一個對象無外乎事件、方法、屬性。childprocess也是一樣。下面列出一些常用的事件、方法和屬性。

事件:

message:當childprocess對象調用send()方法來發送資料時觸發。

error:在工作程序中出現錯誤時發出。該處理程式接收一個錯誤對象作為唯一的參數。

exit:當工作程序結束時發出。該處理程式接收兩個參數,code,signal.

close:當工作程序的所有stdio流都已經終止的時候發出。與exit不同的是,因為多個程序可以共享相同的stdio流。

disconnect:當disconnect()在一個工作程序上被調用時發出。

方法:

kill([signal]):導緻作業系統發送一個kill信号給子程序。預設是sigterm.

send(message,[sendhandle]):将消息發送到句柄。消息可是字元串或對象。sendhandle可以把tcp server或socket對象發送到用戶端。這允許用戶端程序共享相同的端口和位址。

disconnect():關閉父程序與子程序之間的程序通信(或ipc)通道,并把父程序和子程序的連接配接标志都設定為false。

屬性:

stdin:輸入writable流。

stdout:标準輸出readable流。

strerr:用于輸出錯誤的标準輸出readable流。

pid:程序的id。

connected:一個布爾值。在disconnect()被調用後,它被設定為false,當是false時,就不能将消息發送給子程序。

二、實踐

1.exec()在另一程序執行一個系統指令

exec()函數在一個子shell中執行系統指令。幾乎可以執行能從控制台提示符下執行的任何東西,如二進制可執行檔案、shell腳本、python腳本或批處理檔案。

exec(command,[options],callback)函數傳回一個childprocess對象

command:字元串,指定在子shell中執行的指令。

options:對象,指定執行指令時使用的設定。選項如下:

           cwd:指定子程序執行的目前工作目錄

           env:一個對象,指定property:value作為環境的鍵/值對

           encoding:指定存儲指令的輸出時輸出緩沖區使用的編碼

           maxbuffer:指定stdout、stderror輸出緩沖區的大小。預設200*1024.

           timeout:指定父程序在殺掉子程序之前,如果子程序未完成等待的毫秒數。預設0

           killsignal:指定終止子程序時使用的kill信号。預設sigterm。

callback:接收error、stdout、stderr3個參數。

2.execfile()在另一個程序上執行一個可執行檔案

它與exec()相似,不同的是execfile()沒有使用子shell,執行的指令必須是一個二進制可執行檔案linux的shell腳本和windows的批處理檔案不能使用ecexfile().

execfile(file,args,options,callback)也是傳回一個childprocess。

file:字元串,執行要執行的可執行檔案的路徑。

args:數組,指定傳遞給可執行檔案的指令行參數。

options:參考exec()的。

callback:參考exec().

3.spawn()在另一個node.js執行個體中産生一個程序

spawn(cmd,[args],[options])函數産生一個程序,連接配接它們之間的stdio、stdout、stderr的管道,然後在新的線程中使用spawn()執行檔案。它和上面兩個的主要差別是産生的程序中的stdin可以進行配置,并且stdout、stderr都是父程序中的readable流。這意味着exec()、execfile()必須先執行完成,才能讀取緩沖區輸出,但一旦一個spawn()程序的輸出資料已被寫入就可以讀取它(這個可以從它們3個的輸出結果的順序可以看出,上面兩個都是先執行exit事件,而spawn()exit處理是在後面)。

cmd、args和上面兩個的一樣。options也可以設定cwd、env,還可以設定detached、stdio。

detached:布爾值,true時使子程序成為新程序組的組長,即使父程序退出,也會繼續,可以使用child_unref()使得父程序退出之前不等待子程序

stdio:定義子程序stdio配置([stdin,stdout,stderr]).預設[0,1,2].此字元串定義每個輸入輸出流的配置。

4.實作子派生

node.js提供了另外一種程序産生方式——派生。它主要是執行在一個單獨的處理器上運作另外一個v8引擎執行個體中的node.js子產品代碼。可以用派生來并行運作多個服務。不過這需要時間來運轉v8的一個新執行個體,每個執行個體需要大約10m的記憶體,是以應該把派生的程序設計為存活期更長的,不需要大量派生的程序。與spawn不同的是,它不能為子程序配置stdio。可以使用childprocess對象中的send()機制在父程序與子程序間通信。

fork(modulepath,[args],[options])對象也是傳回一個childprocess對象。

modulepath:字元串,指定被新的node.js執行個體啟動的javascript檔案路徑。

args:數組,指定傳遞給node指令的指令行參數。

options:參數對象,指定執行指令時使用的設定。

cwd、env上面有。

encoding:指定資料寫入輸出流時和穿越send()ipc機制時使用的編碼

execpath:指定用于建立産生node.js程序的可執行檔案。

silent:一個布爾值,true時将導緻派生的程序中的stdout和stderr不與父程序相關聯,預設false。

child.send()父程序向子程序發送消息,process.send()是子程序向父程序發送消息。

上面的代碼是在主程序中建立3個子程序,父程序給子程序發消息,子程序接收并給父程序發消息。

繼續閱讀