老鳥:伸着懶腰,看着窗外明媚的陽光,喝一口清茶,心情大美。一天的好心情莫過於此。
老鳥:菜鳥,你這消失了大半個月,忙什麼呢?
菜鳥:據說node最近很火,這不趁着年輕,多儲存點知識儲備呢!
老鳥:那你說說你對node的理解?
菜鳥:node的三大特色:單線程,事件驅動,非阻塞I/O...
老鳥:說說你理解的單線程?
菜鳥:打個比方:皇上處理朝政時,不須要事必躬親,要學會放權。全部的朝政大臣向丞相報告,由丞相進行整理,並把最後的方案向皇上報告。由皇上進行定奪。
老鳥:理解的不錯嘛,可你有沒有想過,node既然是單線程,又是如何實現異步和非阻塞I/O呢?
菜鳥:node是事件驅動,全部的事件作成一個隊列,順序執行的呀
老鳥:你這樣說也沒錯,但node是支持多線程的。當你使用MAC的活動監視器你會發現,實際的進程數爲6node
const http = require('http'); http.createServer((req, res) => { res.end('hello'); }).listen(8000, () => { console.log('server is listening: ' + 8000); });
菜鳥:是由於線程池的緣由嗎?
老鳥:不錯嘛,還知道線程池呢?但非也非也。
老鳥:首先,線程池是按需建立的,當你加載文件IO時,經過ab模擬訪問後,你會發現,線程數發生了變化,這是由於,線程池中默認的默認值爲4。
菜鳥:居然不是線程池?
老鳥:你忽視了node集成了V8引擎?。Node.js啓動後會建立V8實例,而V8實例是多線程的。
菜鳥:如有所思中...
老鳥:主線程在任什麼時候候,都不會阻塞嗎?
菜鳥:老鳥,經你這麼一分析,我可不敢確定的回答了
老鳥:固然不是的。主線程在特定條件下也是會阻塞的。Node.js的事件循環中有一個階段是Poll。poll階段在特定狀況下是會阻塞的。
老鳥:固然,你也不要羞愧,知識是永無止境的,我只是提醒你,要不斷探索,不斷質疑,才能不斷求知。
菜鳥:受教了,給你點個贊,順便收藏一下多線程