理解Node.js的event loop
生活随笔
收集整理的這篇文章主要介紹了
理解Node.js的event loop
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
關于Node.js的第一個基本概念是I/O操作開銷是巨大的:
所以,當前變成技術中最大的浪費來自于等待I/O操作的完成。有幾種方法可以解決性能的影響:
同步方式:按次序一個一個的處理請求。利:簡單;弊:任何一個請求都可以阻塞其他所有請求。
開啟新進程:每個請求都開啟一個新進程。利:簡單;弊:大量的鏈接意味著大量的進程。
開啟新線程:每個請求都開啟一個新線程。利:簡單,而且跟進程比,對系統內核更加友好,因為線程比進程輕的多;弊:不是所有的機器都支持線程,而且對于要處理共享資源的情況,多線程編程會很快變得太過于復雜。
第二個基本概念是每個連接都創建一個新線程是很消耗內存的(例如:你可以對比Nginx回想一下Apache內存耗盡的情景)。Apache是多線程的:它為每個請求開啟一個新的線程(或者是進程,這取決于你的配置),當并發連接增多時,你可以看看它是怎么一點一點耗盡內存的。Nginx和Node.js不是多線程的,因為線程的消耗太“重”了。它們兩個是單線程、基于事件的,這就把處理眾多連接所產生的線程/進程消耗給消除了。
Node.js中你的代碼運行在單線程之中
確實只有一個線程:你不能并行執行任何代碼,比如:下面的“sleep”將會阻塞sever1秒鐘:
while(new Date().getTime() < now + 1000) {// do nothing}
當這段代碼運行時,Node.js不會響應客戶端任何請求,因為只有一個線程來運行你的代碼,另外,如果你執行cpu密集的任務,比如重設圖像的大小,它也會阻塞所有請求。
……然而,除了你的代碼,其它的一切都是并行執行的
單線程沒法讓代碼并行執行。但是所有I/O操作都是事件驅動、并行的,所以下面的代碼不會阻塞server:
????? ??
c.query('SELECT SLEEP(20);', function (err, results, fields) {if (err) {throw err;}res.writeHead(200, {'Content-Type': 'text/html'});res.end('Return from async DB query ');c.end();});
如果你在一次請求中執行這些,當數據庫sleep時,其他請求也會立即被處理。
為什么異步比較好?什么時候我們應該從同步轉移到異步/并行執行呢?
同步執行也不錯,因為它簡便了我們敲代碼。但在使用異步時,你不必關心后端是怎么處理的。而且,在I/O操作時不會阻止其他請求,同時無需承擔每個請求所產生的線程/進程的成本。I/O操作時使用異步處理很好,因為I/O操作的成本比單純執行代碼要高的多,我們應該在等待I/O時做其它更有意義的工作。
轉載于:https://my.oschina.net/freax/blog/413785
總結
以上是生活随笔為你收集整理的理解Node.js的event loop的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sizzle.selectors.mat
- 下一篇: Eclipse快捷键-方便查找