大家好,
在第一篇文章中,我將寫有關(guān)事件循環(huán)(主循環(huán)、主線程、事件線程等...)的內(nèi)容,這是真正想了解 Javascript 的人思考的主題之一。我還想補(bǔ)充一點(diǎn),這篇文章將是我自己做的筆記的匯編,而不是專業(yè)的。我為我的錯(cuò)誤提前道歉。
在下圖中,您可以看到 Nodejs 中的 javascript v8 引擎、事件循環(huán)機(jī)制和 libuv 庫。 libuv 庫可以執(zhí)行一些 Javascript 無法提供的任務(wù)。如果我們?cè)跒g覽器中運(yùn)行 javascript,我們就會(huì)使用瀏覽器提供的 Web api 來運(yùn)行。
事件循環(huán)是一種架構(gòu)設(shè)計(jì)模式。這種方式之所以受到青睞,與javascript的工作原理有直接關(guān)系。 javascript 運(yùn)行單線程和非阻塞 i/o。換句話說,雖然它運(yùn)行在單線程上,但在執(zhí)行耗時(shí)任務(wù)時(shí)并沒有被阻塞,而是繼續(xù)工作。它通過事件循環(huán)架構(gòu)解決了這個(gè)問題。
當(dāng)程序運(yùn)行時(shí),全局執(zhí)行上下文被創(chuàng)建并添加到調(diào)用堆棧中。在程序流程完成之前,不會(huì)將其從調(diào)用堆棧中刪除。事實(shí)上,為每個(gè)函數(shù)創(chuàng)建了一個(gè)執(zhí)行上下文。一旦函數(shù)完成,它就會(huì)從調(diào)用堆棧中刪除。但它并不總是這樣。
在某些情況下,函數(shù)需要時(shí)間才能完成其功能。例如,網(wǎng)絡(luò)請(qǐng)求或來自文件的數(shù)據(jù)讀寫操作、DOM 事件(并非全部)。在這種情況下,該函數(shù)由線程池或Web API 處理。當(dāng)進(jìn)程完成時(shí),回調(diào)函數(shù)被添加到回調(diào)隊(duì)列(任務(wù)隊(duì)列)中。當(dāng)輪到它時(shí)(當(dāng)調(diào)用堆棧清空時(shí)),它被轉(zhuǎn)移到調(diào)用堆棧并被處理。一旦處理完畢,它就會(huì)從調(diào)用堆棧中刪除。微任務(wù)隊(duì)列中的作業(yè)先于回調(diào)隊(duì)列中的作業(yè)處理。例如 Promise、Mutation Observer、queueMicrotask
Node.js 中的線程池和瀏覽器中的 Web Workers 用于執(zhí)行需要密集 CPU 能力的異步操作和作業(yè)。我不會(huì)在這里討論它們?cè)谟梅ê头秶系牟町?。我想說的是:我們可以使用不同的機(jī)制來處理 JavaScript 無法處理的任務(wù)。
以上就是Nodejs 事件循環(huán)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)