摘要:對了,我記得你提到了,它是什么不是說使用的是嗎,它和又有什么關系未完待續其他問答方式學一參考是用來做什么的廠長的回答更快的異步函數和
Q: 好了,我們繼續談談 Node.js 吧,我記得上次說到了「非阻塞」和「事件驅動」,這引起了我的好奇心,但是又給我潑了一桶冷水,這兩個詞有點高端。
A:別急,我們先來看一個簡單的場景:
人人網刷朋友新鮮事你應該用過吧?實現這樣的功能有一種簡單的方式,是讓用戶與服務器之間保持一個長輪詢。
但是它與普通的 Ajax 不一樣,服務器不會立馬返回信息,它會先 hold 住,等待應該返回信息了,它才會返回信息(比如你的好友發了一條新的狀態)。
從傳統服務端來看(比如 Apache),每次一個新用戶連到你的網站上,你的服務器得新開一個連接,每個連接都需要占用一個線程,這些線程大部分都是閑著的(比如等你的好友發狀態,查數據庫等),雖然它們是閑著的,但是照樣占用了內存,也就是說,如果用戶達到一定的規模,服務器的內存就會耗光而癱瘓。
解決辦法有很多,比如說使用線程池,但是它依然是阻塞的,如果線程池里的所有線程都被阻塞(網速慢,被人惡意暫用)那么接下來的請求將會排隊等待。
Node.js 就不相同了,它使用了「非阻塞」與「事件驅動」模型,你可以把它想象成一個 Event Loop 循環,這個循環會一直跑。一個新的請求來了,Event Loop 接收這個請求,然后交給其他線程,比如查詢數據庫,然后響應一個 callback,接著接收其他請求,而不是等待數據庫結果的返回。
如果數據庫返回了結果,服務端將會把它返回給客戶端,并繼續循環。這就是事件驅動:服務端只在有事情發生時,才會有相應的處理(或者是接受請求,或者是一些 callback)。
Q:這么看來,Node.js 的非阻塞和事件驅動,是基于這個 Event Loop 的?A:是的,簡單來講,Node.js 的 Event Loop 是基于 libuv,而瀏覽器的 Event Loop 則是在 html5 規范 中定義,具體實現交給瀏覽器廠商。
Q:有趣了,還有兩種 Event Loop。A:對比來看,它們有點相似:
在瀏覽器中比較簡單,值得注意的一點是,會在每個 tasks 之后,會把當前 microtask 隊列里的任務都執行完:
Node.js 稍微復雜一點,每次 Event Loop 都需要經過六個階段,每一個階段之后,都會執行 nextTick、microtasks (resolved promise, 等):
┌───────────────────────┐ ┌─>│ timers │ <─── setTimeout/setInterval callback │ └──────────┬────────────┘ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <─────────────── │ │ │ │ │ microTask queue │ │ ┌──────────┴────────────┐ └─────────────────────────┘ │ │ I/O callbacks │ │ └──────────┬────────────┘ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <─────────────── │ │ │ │ │ microTask queue │ │ ┌──────────┴────────────┐ └─────────────────────────┘ │ │ idle, prepare │ <─── 僅內部使用 │ └──────────┬────────────┘ │ │ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <──────────────── │ │ │ │ │ microTask queue │ │ │ └─────────────────────────┘ │ │ ┌─────────────────────────┐ │ ┌──────────┴────────────┐ │ incoming: │ │ │ poll │ <────┤ connections, │ │ └──────────┬────────────┘ │ data, etc │ │ │ └─────────────────────────┘ │ │ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <──────────────── │ │ │ │ │ microTask queue │ │ │ └─────────────────────────┘ │ ┌──────────┴────────────┐ │ │ check │ <─── setImmediate callback │ └──────────┬────────────┘ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <─────────────── │ │ │ │ │ microTask queue │ │ ┌──────────┴────────────┐ └─────────────────────────┘ │ │ close callbacks │ <─── eg: socket.on("close",func) │ └──────────┬────────────┘ ┌─────────────────────────┐ │ │ │ nextTick queue │ │ │ <─────────────── │ │ └─────────────┴ │ microTask queue │ └─────────────────────────┘
來一段簡單的代碼,猜猜瀏覽器(Chrome)和 Node.js 分別輸出什么:
console.log("start"); setTimeout(() => { console.log("timer1"); Promise.resolve().then(() => { console.log("promise1"); }); }, 0); setTimeout(() => { console.log("timer2"); Promise.resolve().then(() => { console.log("promise2"); }); }, 0); console.log("end");Q:瀏覽器 (Chrome) 中肯定是輸出 start、end、time1、promise1、time2、promise2,至于 Node.js 中,我猜也是一樣的吧?
A:我們先來驗證一下:
瀏覽器中:
start end timer1 promise1 timer2 promise2
Node.js 中:
start end timer1 timer2 promise1 promise2
看來和想象中的不一樣,別急,看個動圖就會明白了:
瀏覽器中:
Node.js 中:
Q:原來是這樣,那如果在每個 setTimeout callback 里加上 process.nextTick 那么是比 Promise.then 先執行?A:是的,還記得上面所說過的嗎,在每個階段后都會執行 nextTick queue 以及 micktasks queue,nextTick queue 的優先級比 micktasks queue 高。
Q:我懂了。對了,我記得你提到了 libuv,它是什么?不是說 Node.js 使用的是 v8 嗎,它和 v8 又有什么關系?A:...
未完待續...
其他問答方式學 Node.js(一)
參考https://blog.csdn.net/wtopps/...
Node.js 是用來做什么的? - 廠長的回答
Promises, Next-Ticks and Immediates— NodeJS Event Loop Part 3
更快的異步函數和 Promise
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101074.html
摘要:就是一個用于搭建類似于網頁版知乎這種表單項繁多,且內容需要根據用戶的操作進行修改的網頁版應用。單頁應用程序顧名思義,單頁應用一般指的就是一個頁面就是應用,當然也可以是一個子應用,比如說知乎的一個頁面就可以視為一個子應用。 最近在逛各大網站,論壇,以及像SegmentFault等編程問答社區,發現Vue.js異常火爆,重復性的提問和內容也很多,樓主自己也趁著這個大前端的熱潮,著手學習了一...
稍微整理了一下自己平時看到的前端學習資源,分享給大家。 html MDN:Mozilla開發者網絡 SEO:前端開發中的SEO css 張鑫旭:張鑫旭的博客 css精靈圖:css精靈圖實踐 柵格系統:詳解CSS中的柵格系統 媒體查詢:css媒體查詢用法 rem布局:手機端頁面自適應布局 移動前端開發之viewport的深入理解:深入理解viewport 淘寶前端布局:手機淘寶移動端布局 fl...
摘要:前言月份開始出沒社區,現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區,現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...
摘要:雖然程序員有時候很喜歡自黑風格也比較獨特,但程序員也只是會編程的普通人,和其他的廚師教師公務員并沒有什么區別。 前言 今天是1024程序員節,中國500w+的程序員今天可以享受一天專屬的節日,網絡上也有各種慶祝方式: 一些公司祭出了程序員鼓勵師 showImg(https://segmentfault.com/img/remote/1460000016788859); 一些公司給程序員...
閱讀 2513·2023-04-25 17:27
閱讀 1824·2019-08-30 15:54
閱讀 2369·2019-08-30 13:06
閱讀 2980·2019-08-30 11:04
閱讀 746·2019-08-29 15:30
閱讀 729·2019-08-29 15:16
閱讀 1733·2019-08-26 10:10
閱讀 3603·2019-08-23 17:02