這篇文章聊聊Nodejs中的事件循環,希望帶大家去搞懂Nodejs中的事件循環,從此再也不怕面試官的靈魂發問:談談Nodejs的事件循環!
想必大家面試的時候,都會被面試官問:「談談Nodejs的事件循環吧」。
因為本人也被問過,但每次都很尷尬。
關於這個問題各種技術部落格上有很多介紹,但我一直都沒搞清楚。因為這些文章往往上來就是一大堆圖示、用語,瞬間澆熄了認知的勇氣。 【相關教學推薦:nodejs影片教學、程式設計教學】
但不能不懂啊,面試官還要問,於是流著淚、咬著牙,參考了一些教程,有了自己的總結,馬上分享給大家。
一、什麼是事件循環?
一句話:事件循環是Nodejs處理非同步操作的機制。
Js是單執行緒的,為什麼Nodejs就能處理非同步操作?
因為Nodejs把多執行緒的操作交給了系統核心。
上圖:
#Nodejs就像一個聰明的小孩,基於Js的它本身無法實作多執行緒操作,但是它把多執行緒的操作丟給了系統核心。
因為系統核心大部分都是多執行緒的,核心執行起來那不是so easy,那Nodejs就高枕無憂了嘛?
二、為什麼需要事件循環?
(先解釋一下事件循環這個名稱,Nodejs是事件驅動的,當什麼時候做什麼事情,做的事情就定義在回調函數中;
因此可以將回調函數定義為事件處理函數;所以管理回呼函數的機制叫做事件循環;)
既然核心那麼強大,Nodejs無事可做?
非也,核心執行完畢之後,Nodejs總得執行對應的回呼函數吧。
所以就需要一個機制來幫助它管理、維護這些非同步操作回呼函數,防止它們打架啊、亂串啊。
從而以一種有效率的方式執行。所以這就是為什麼需要---事件循環---。
總結:事件循環是Nodejs用來控制非同步程式碼回呼執行順序的!
三、怎麼理解事件循環?
? 口訣一:同步任務總是比非同步任務執行更早;
非同步API分類
同步任務無需多言,這裡先將Nodejs中的非同步API進行分類:
簡單理解,針對上述三種非同步API,事件循環內部提供了3種佇列,
奇怪?為什麼沒有process.nectTick?
哈哈,那是因為process.nectTick本身就很奇怪!
process.nectTick
雖然process.nectTick屬於非同步API,但不屬於事件循環的一部分。
上圖:
#這裡就牽涉到另一個概念:非同步模組!
非同步模組
就是這個神奇的傢伙,nodejs使用libuv函式庫呼叫內核,實作多執行緒的操作!
那這個跟process.nectTick有幾毛錢關係?
有,因為process.nectTick可以理解為非同步模組的一部分。
因此,process.nectTick總是會在事件循環之前被呼叫!
? 口訣二:process.nectTick是所有非同步任務裡面最快執行的;
(註:理解Tick
事件循環3種隊列運行一周,成為一個Tick!)
好,明白了!
等等......好像還缺了什麼? Promise又是怎麼執行的?
Promise
除了nextTick隊列,還有一個特殊的隊列:微任務隊列。微任務隊列,主要就是用來處理Promise回呼函數的執行。
那微任務佇列的執行順序又是怎麼樣的呢?
上圖:
? 口訣三:微任務佇列追加在process.nectTick佇列後面,事件循環的前面;
#上面講了這麼多,整體看下
? 口訣四:實踐出真知;
利用上面的理論,聰明的你,能分析一下最終的列印順序嘛?
console.log('同步代码')setImmediate(() => { console.log('setImmediate');})setTimeout(() => { console.log('setTimeout');}, 100)Promise.resolve().then(() => { console.log('promise');})process.nextTick(() => { console.log('Tick');})复制代码
那下次我們就結合具體的面試案例,看看它們的列印順序到底是怎麼樣。
更多node相關知識,請造訪:nodejs 教學!
以上是一文搞懂Node的事件循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文由宝塔面板教程栏目给大家介绍关于server2022安装宝塔后出现不能远程的问题,不知道大家有没有遇到这样的问题呢?下面就带大家一起来看看我是怎么处理的吧!

对MySQL大文本数据存储进行简单的调研,通过牺牲部分CPU资源对数据压缩,使数据占用更小的空间,从而减少磁盘I/O和网络I/O

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。 换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。 闭包会随着函数的创建而被同时创建。

count(*)为什么很慢?下面本篇文章就来给大家分析一下原因,并聊聊count(*)的执行过程,希望对大家有所帮助!

在一些底层的库中, 经常会看到使用 unsafe 包的地方。本篇文章就来带大家了解一下Golang中的unsafe包,介绍一下unsafe 包的作用和Pointer的使用方式,希望对大家有所帮助!

本篇文章给大家带来了关于git的相关知识,其中主要跟大家聊一聊怎么让你的git记录保持整洁,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。