本文目錄一覽:
- 1、使用node.js 的優勢和劣勢都有哪些
- 2、js進程和線程的區別
- 3、nodejs cluster 主進程有什麼用
- 4、NodeJs多線程、多進程、定時任務
- 5、Node.js真的有高並發優勢嗎
使用node.js 的優勢和劣勢都有哪些
Node.js優點:
1、採用事件驅動、非同步編程,為網路服務而設計。其實Javascript的匿名函數和閉包特性非常適合事件驅動、非同步編程。而且JavaScript也簡單易學,很多前端設計人員可以很快上手做後端設計。
2、Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統資源耗用下的高性能與出眾的負載能力,非常適合用作依賴其它IO資源的中間層服務。3、Node.js輕量高效,可以認為是數據密集型分散式部署環境下的實時應用系統的完美解決方案。Node非常適合如下情況:在響應客戶端之前,您預計可能有很高的流量,但所需的伺服器端邏輯和處理不一定很多。
Node.js缺點:
1、可靠性低
2、單進程,單線程,只支持單核CPU,不能充分的利用多核CPU伺服器。一旦這個進程崩掉,那麼整個web服務就崩掉了。
不過以上缺點可以可以通過代碼的健壯性來彌補。
js進程和線程的區別
一、線程和進程基本概念
進程:操作系統分配的佔有CPU資源的最小單位。擁有獨立的地址空間。
線程:安排CPU執行的最小單位。同一個進程下的所有線程,共享進程的地址空間。
簡單講,計算機就像工廠,進程是個大車間,計算機內部有很多個這樣的大車間。線程是工人,每一個車間里的工人至少有一個。
為什麼這麼畫呢?有點一個挨一個的效果呢?是因為以前我就老是疑惑進程或者線程運行時到底是並行?還是串列?
其實,在單CPU或單核的情況下,宏觀上無論是進程也好,線程也罷,都是並行的。而在微觀下,某一個具體的時刻,他們實際上都是串列的。在多CPU或多核的情況下,才是真正意義的並行。
二、線程和進程的關係、通性
關係:進程中包含著至少一個線程。在進程創建之初,就會包含一個線程,這個線程會根據需要,調用系統庫函數去創建其他線程。但需要注意的是,這些線程之間是沒有層級關係的,他們之間協同完成工作。在整個進程完成工作之後,其中的線程會被銷毀,釋放資源。
通性:都包含三個狀態,就緒、阻塞、運行。通俗的講,阻塞就是資源未到位,等待資源中。就緒,就是資源到位了,但是CPU未到位,還在運行其他。
三、線程的好處
既然,線程和進程是存在通性的,那麼為什麼操作系統還要設置線程這個單位,那就說說線程的幾點好處:
1、在一個程序中,多個線程可以同步或者互斥並行完成工作,簡化了編程模型;
2、線程較進程來講,更輕;
3、線程雖然微觀並行。但是,在一個進程內部,一個線程阻塞後,會執行這個進程內部的其他線程,而不是整體阻塞。從某種意義上,提高了CPU的利用率。
四、市面上的通用叫法
單線程與多線程,都指在一個進程內的單和多。不要笑我,之前真的不懂。心中那隻小羊駝,奔過來,跑過去。還抬起了傲嬌的眼睛,看了我一眼,呵呵~~~
五、javaScript單線程執行機制
1、 首先解釋下,單線程和多線程。
什麼是單線程?單線程就是一個進程中只有一個線程。程序順序執行,前面的執行完,才會執行後面的程序。
什麼是多線程?多線程就是一個進程中只有多個線程。在進程內部進行線程間的切換,由於每個線程執行的時間片很短,所以在感覺上是並行的。
2、那麼為什麼感覺上javaScript是多線程?而且還支持AJAX非同步呢?AJAX是真正的非同步嗎?
先說明,從哪裡可以得出javaScript是單線程。比如你頁面一上來就alert(「hello world~」);只要你不關閉這個對話框,後續的js代碼就不會再執行。因為,單線程就是這樣一步一步的順次執行,前面不執行完,後面不會執行。也就是說,在具體的某一時刻,只有一段代碼在執行。
可是,JavaScript明明可以處理各種觸發事件,感覺上是非同步多線程啊。其實,它的原理是這樣的,JavaScript單線程的執行瀏覽器的一個事件隊列,要執行的函數和觸發事件的回調函數都被放在這個隊列中。比如,我點擊率一下按鈕,之後又將瀏覽器縮小了,那麼這兩個事件的回調函數就會順次地被放在當前執行的「函數」之後,再一一執行。
那麼,既然JavaScript是單線程,那麼如何維護這個函數隊列呢,他分身無術啊。這時候,就需要知道,瀏覽器可不是單線程。雖然,每一個window只有一個js引擎,但是瀏覽器是事件驅動的、非同步的、多線程的。
瀏覽器內部有一個事件輪詢(event loop),是一個大的內部消息循環,會輪詢大的消息隊列,並執行。也就是js要處理的事件隊列,是瀏覽器維護的。
瀏覽器至少有四個線程(不同瀏覽器會有差異): js引擎線程、界面渲染線程、瀏覽器事件觸發線程、http請求線程。
其實,到這裡就說的很明白了。但是,又想到了延時函數(setTimeout)的例子,感覺上,因為沒有阻塞執行,會感覺是非同步,其實並不是。只是,js在執行到延時函數時,會觸發瀏覽器的定時器,到設置時間,瀏覽器再將這個函數放入執行的函數隊列,再由JavaScript引擎執行。都是在瀏覽器空閑了才會執行。
關於AJAX的非同步,是真正的非同步。同樣的道理,在調用AJAX的時候,瀏覽器會開闢一個新的線程,去處理這個請求,得到響應後,如果這個請求有回調,會將這個回調再放入事件隊列中。再由JavaScript引擎執行。
3、關於JavaScript的阻塞
瀏覽器雖然是多線程,但是由於JavaScript具有阻塞特性,無論外鏈還是內嵌腳本,在瀏覽器執行解釋js腳本的時候,瀏覽器是不會去做別的事情的,比如渲染頁面,而是直到js下載並執行完畢。
這樣,js腳本的下載、解釋執行,會反該頁面的繼續繪製,給用戶帶來不良的體驗。所以,要對其優化,有如下幾點:
a、將script內嵌和外鏈,在可以的情況下,放在body底部。註:對於css,瀏覽器是並行下載
b、在頁面onload後,載入js
c、html5 script標籤的defer屬性,在頁面載入完成後下載
d、使用創建script標籤的方式,在頁面載入完成後添加進去。
註:解決阻塞就是一句話,先讓頁面渲染完,再載入js。
六、Node.js單線程執行機制
腦子就像有問題一樣。js都是單線程的了,node.js就是js實現的,還能是多線程?!!呵呵噠~
Node.js其實還不是真正意義上的js,他是借用了js語法實現的,達到真正意義的非阻塞服務端語言。但是他的運行機制,也是事件輪詢 (Event Loop)。
nodejs cluster 主進程有什麼用
我們都知道nodejs最大的特點就是單進程、無阻塞運行,並且是非同步事件驅動的。Nodejs的這些特性能夠很好的解決一些問題,例如在伺服器開發中,並發的請求處理是個大問題,阻塞式的函數會導致資源浪費和時間延遲。通過事件註冊、非同步函數,開發人員可以提高資源的利用率,性能也會改善。既然Node.js採用單進程、單線程模式,那麼在如今多核硬體流行的環境中,單核性能出色的Nodejs如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Nodejs進程,利用某些通信機制來協調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發布,而NodeJS 0.6.x 以上的版本提供了一個cluster模塊 ,允許創建「共享同一個socket」的一組進程,用來分擔負載壓力。本篇文章就基於該cluster模塊來講述Node.js在多核CPU下的編程。
Cluster模塊介紹
nodejs所提供的cluster模塊目前尚處於試驗階段,在v0.10.7的官方文檔上我們可以看到模塊的發布信息如下:
Stability: 1 – Experimental
關於該模塊的功能,源文檔描述如此「A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.」 其意就是:Node的示例以單進程的模式運行,有時為了充分利用多核系統的資源用戶需要運行一組Node進程來分擔負載。
Cluster用法介紹
首先貼出一段該模塊示例應用代碼,接下來進行詳細分析,代碼如下:
複製代碼
var cluster = require(‘cluster’);
var http = require(‘http’);
var numCPUs = require(‘os’).cpus().length;
if (cluster.isMaster) {
require(‘os’).cpus().forEach(function(){
cluster.fork();
});
cluster.on(‘exit’, function(worker, code, signal) {
console.log(‘worker ‘ + worker.process.pid + ‘ died’);
});
cluster.on(‘listening’, function(worker, address) {
console.log(“A worker with #”+worker.id+” is now connected to ” +
address.address +
“:” + address.port);
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end(“hello world\n”);
console.log(‘Worker #’ + cluster.worker.id + ‘ make a response’);
}).listen(8000);
}
複製代碼
這段代碼很簡單,主線程就是當前運行的js文件,主線程根據你本機系統的核數來創建子進程。所有進程共享一個監聽埠8000,當有請求發起時,主線程會將該請求隨機分配給某個子進程。console.log(‘Worker #’ + cluster.worker.id + ‘ make a response’);這句代碼可以列印出是哪個進程處理該請求。
問題分析
我們前面提到有請求發起時,由系統來決定將該請求交給哪個進程進行處理。這種完全依賴於系統的負載均衡存在著一個重要缺陷:在windows,linux和Solaris上,只要某個子進程的accept queue為空(通常為最後創建的那個子進程),系統就會將多個connetion分配到同一個子進程上,這會造成進程間負載極為不均衡。特別是在使用長連接的時候,單位時間內的new coming connection並不高,子進程的accept queue往往均為空,就會導致connection會不停的分配給同一個進程。所以這種負載均衡完全依賴於accept queue的空閑程度,只有在使用短連接,而且並發非常高的情況下,才能達到負載均衡,但是這個時候系統的load會非常高,系統也會變得不穩定起來。
後記
後續筆者還將就nodejs下的多進程開發進行學習研究,並將總結進行分享。
NodeJs多線程、多進程、定時任務
JS是單線程語言,減少了線程間切換的開銷,且不用考慮鎖的問題,因此適合IO密集型項目。
JS的單線程,其實指的是js主引擎線程的。除此之外還有定時器線程、非同步http線程(ajax)等,最終通過Event Loop協調執行。
為了充分利用多核CPU,可以使用 worker_threads 實現多線程, child_process 或 cluster 實現多進程(master-worker模式)。
不同於瀏覽器中的 web worker ,nodejs中通過 worker_threads 實現多線程。通常在計算密集型場景中,才需要使用NodeJs多線程,因此使用場景較少。
electron中即經常使用該模塊。
cluster 封裝了 child_process.fork ,並內置了負載均衡,可有效實現多進程。
Node.js真的有高並發優勢嗎
是的,適合I/O密集型應用,其特點為:
1. 它是一個Javascript運行環境
2. 依賴於Chrome V8引擎進行代碼解釋
3. 事件驅動
4. 非阻塞I/O
5. 輕量、可伸縮,適於實時數據交互應用
6. 單進程,單線程
最大優勢:可以處理數萬條連接,本身沒有太多的邏輯,只需要請求API,組織數據進行返回即可
缺點也是明顯的:
1. 不適合CPU密集型應用;
2. 只支持單核CPU,不能充分利用CPU
3. 可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312596.html