在Node.js中,只支持單線程。可是在應用程序中,若是隻使用單線程進行操做,從接收請求開始到返回響應爲止的這段時間內可能存在很長的一段等待時間。在這種場合下,若是可以使用多進程,則能夠爲每一個請求分配一個進程,從而能夠更好地使用服務器端的CPU資源。爲了實現多線程處理,Node.js中提供了child_process
模塊與cluster
模塊,其中的child_process
模塊用於實如今Node.js應用程序中開啓多個子進程,並在各個子進程中運行各類不一樣的命令或執行Node.js模塊文件,可執行文件的處理,cluster
模塊用於實如今Node.js應用程序中開啓多個子進程,在每一個子進程中運行一個Node.js應用程序副本的處理。
process.execPath
: 用於運行應用程序的可執行文件的絕對路徑version
: Node.js的版本號versions
: Node.js及其各依賴的版本號platform
: 當前運行Node.js的平臺stdin
: 用於讀入標準輸入流的對象。默認狀況下,標準輸入流處於暫停狀態,好比恢復讀取標準輸入流process.stdin.resume()
stdout
: 用於寫入標準輸出流的對象stderr
: 用於寫入標準錯誤輸出流的對象javascript
process.stdout
對象與process.stderr
對象的寫數據操做是一種阻塞型操做pipe
方法,而且將process.stdout
對象或process.stderr
對象做爲目標對象的時候,process.stdout
對象與process.stderr
對象的寫數據操做纔是非阻塞型操做。argv
: 屬性值爲一個數組,包含了運行Node.js應用程序時全部命令行參數。env
: 運行Node.js應用程序的操做系統的信息config
: 包含了用於編譯當前Node.js應用程序的可執行文件的配置選項的JavaScript描述pid
: 運行當前Node.js應用程序的進程PIDtitle
: 運行當前Node.js應用程序命令行窗口的標題arch
: 運行當前Node.js應用程序的處理器架構,arm,ia32,x64等memoryUsage()
rss
: 屬性值爲一個整數,表示運行Node.js應用程序的進程的內存消耗量,單位爲字節headTotal
: 屬性值爲一個整數,表示爲V8所分配的內存量,單位爲字節headUsed
: 屬性值爲一個整數,表示V8的內存消耗量,單位爲字節nextTick()
方法process.nextTick(callback)
參數爲被推遲的函數setTimeout
方法的事件參數值指定爲0
的做用相同nextTick()
方法中指定的函數的調用速度比setTimeout
方法中指定的函數的調用速度快不少nextTick()
const process = require('process'); const fs = require('fs'); var finish = function () { console.log('文件讀取完畢'); } process.nextTick(finish); console.log(fs.readFileSync('./fs.js').toString());
const process = require('process'); const fs = require('fs'); function foo() { process.nextTick(Task); } function Task() { var file = fs.createReadStream('./fs.js'); file.on('data', (data) => { console.log('Task函數中,讀取到字節長度:', data.length); }) } var file = fs.createReadStream('./fs.js'); file.on('data', (data) => { console.log('全局中,讀取到字節長度:', data.length); }); foo();
process.maxTickDepth
屬性,默認的屬性值爲1000,當遞歸深度達到process.maxTickDepth
屬性值以後,容許遞歸函數以外的代碼繼續執行,可是會發出警告,提醒開發者改用setImmediate
方法process.abort()方法
SIGABRT
信號,使進程異常終止,同時產生一個核心文件,該方法中不使用任何參數process.chdir()
process.chdir(directory)
process.cwd()
const process = require('process'); console.log('當前目錄:' + process.cwd()); process.chdir('../'); console.log('上層目錄:' + process.cwd());
process.exit()
0
表示正常退出,不使用該參數時的默認參數值爲0
ID
process.getgid()
返回運行Node.js應用程序的進程的組ID
,該方法只有在非windows操做系統下有效,不使用任何參數process.setgid(id)
用於設置運行Node.js應用程序的進程的組ID
,該方法只有在非windows操做系統下有效,不使用任何參數setgid
方法中使用一個參數,參數值能夠爲一個整數類型的組ID
,也能夠爲一個字符串類型的組名,若是指定組名,該組名將自動解析爲組ID
ID
process.getuid()
返回運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操做系統下有效,不使用任何參數process.setuid(id)
用於設置運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操做系統下有效process.kill(pid, [signal])
用於向進程發送信號pid
參數爲必須指定參數,signal
參數爲可選參數,pid
參數爲一個整數,用於指定須要接收信號的進程ID
,signal
參數值爲一個字符串,用於指定須要發送的信號,例如SIGINT
或SIGUSR1
,當不使用該參數時,默認參數值爲SIGTERM
,表示終止該進程umask([mask])
用於讀取或修改運行Node.js應用程序的進程的文件權限掩碼。const process = require('process'); var oldmask, newmask = 0644; oldmask = process.umask(newmask); console.log('修改前的掩碼:', oldmask.toString(8)); console.log('修改後的掩碼:', newmask.toString(8)); /**** * 修改前的掩碼: 0 * 修改後的掩碼: 644 */
process.uptime()
process.hrtime()
const process = require('process'); let time = process.hrtime(); for (let i = 0; i < 1000; i++) { } var endTime = process.hrtime(time); console.log(endTime);
exit
const process = require('process'); process.on('exit', () => { console.log('Node.js程序退出'); }); process.exit();
uncaughtException
const process = require('process'); process.on('uncaughtException', (err) => { console.log('捕獲到一個異常錯誤', err); }); undefinedFunction();
spawn
方法開啓子進程child_process.spawn(command, [args], [options])
command
參數值爲一個字符串,指定須要運行的命令args
爲一個數組,存放了全部運行該命令時所須要使用的參數,參數的指定順序與數組中的元素順序保持一致,默認爲空option
參數值爲一個對象,用於指定開啓子進程時所使用的選項java
cwd
: 指定子進程當前的工做目錄stdio
: 設置子進程的標準輸入/輸出customFds
: 數組,子進程的標準輸入/輸出指定文件描述符env
: 爲子進程指定環境變量,不指定時,沒有可使用的環境變量detached
: 布爾值,該子進程爲一個進程組中的領頭進程uid
: 設置子進程的用戶ID
gid
: 設置子進程的組ID
const process = require('process'); const cp = require('child_process'); let sp1 = cp.spawn('node', ['test1.js', 'one', 'two', 'three'], {cwd: './one'}) let sp2 = cp.spawn('node', ['test2.js'], {stdio: 'pipe'}); sp1.stdout.on('data', (data)=>{ console.log('子進程 sp1 標註輸出:', data); sp2.stdin.write(data); }); sp1.on('exit', (code, signal)=>{ console.log('子進程 sp1 退出,退出代碼爲', code); process.exit(); });