在如今機器的CPU都是多核的背景下,Node的單線程設計已經沒法更充分的"壓榨"機器性能了。所以從v0.8開始,Node新增了一個內置模塊――“cluster”,故名思議,它可以通過一個父進程管理一坨子進程的方式來實現集群的功能。
var cluster = require('cluster');var http = require('http');var numCPUs = require('os').cpus().length; // 獲取CPU的個數 if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); });} else { http.createServer(function(req, res) { res.writeHead(200); res.end("hello world/n"); }).listen(8000);}通過isMaster屬性,判斷是否Master進程,是則fork子進程,否則啟動一個server。每個HTTP server都能監聽到同一個端口。但是在實際項目中,我們的啟動代碼一般都已經封裝在了app.js中,要把整塊啟動邏輯嵌在上面的if else中實在不優雅。 所以,我們可以這樣:
var cluster = require('cluster');var numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } // 其它代碼 } else { require("./app.js");}簡單之處就在于原本的應用邏輯根本不需要知道自己是在集群還是單邊。(當然,如果應用在內存中維護了某些狀態,比如session,就需要運用某些機制來共享了,這里不詳說)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答