成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

?Node.js中的事件循環是如何工作的

譯文 精選
開發 前端
根據Node.js官方網站的說法,事件循環允許Node.js執行非阻塞I/O操作——盡管JavaScript是單線程的——會盡可能地將操作轉移到系統內核中。

?譯者 | 盧鑫旺

當我們啟動一個Node.js應用程序時,它會加載事件循環并將必要的回調函數添加到回調棧中。在本文中,你將詳細了解Node.js中的事件循環是如何工作的。

一、為什么你應該了解Node.js中的事件循環

以下幾點闡述為什么了解事件循環很重要:

理解事件循環的原理有助于你寫出更高效的代碼

當你的應用程序出現異常錯誤時能幫你更容易地調試你的代碼

二、什么是事件循環

根據Node.js官方網站的說法,事件循環允許Node.js執行非阻塞I/O操作——盡管JavaScript是單線程的——會盡可能地將操作轉移到系統內核中。

我們可以把這個定義分解為三個關鍵字:

  • 非阻塞I/O操作
  • 單線程
  • 系統內核

1.非阻塞I/O操作

如果一個操作的執行沒有被阻塞,我們就說這個程序是非阻塞的。既然我們在這里提到了非阻塞,那么我們也應該提到什么是阻塞。它只是意味著你必須在一個操作完成后才能再完成另一個操作。

2.單線程

如果一個程序只有一個調用棧,并且它使用了先進先出的概念,在同一個時刻只能執行一個任務,那么這個程序就是單線程的。這意味著棧上的第一個程序總是在下一個程序之前運行。雖然JavaScript看起來是單線程的語言,不過這只取決于它運行的環境。

3.系統內核

在這里,內核只是指運行程序的操作系統。Javascript是單線程的,但Node.js在執行多個輸入輸出(I/O)操作時能夠不阻塞線程。它通過盡可能將此操作交給操作系統(例如Linux、Windows、Mac OS X等)來實現這一點。操作大多被轉移到操作系統中;這就是Javascript與Node.js的區別。

三、Node.js中的事件循環是如何工作的

當我們啟動node應用程序時,事件循環立即開始運行。事件循環有多個階段,每個階段都有要執行的回調隊列。當事件循環被添加到特定階段時,它將在該特定階段執行一些操作,然后在該階段隊列中執行一些回調。

這將一直持續到隊列為空或已經執行了最大數量的回調函數。當達到限制時,事件循環會進入下一階段執行相同的操作。

有四個最重要的階段:

  • 到期時間回調
  • I/O輪詢和回調
  • setImmediate回調
  • close回調

1.到期時間回調

該階段負責處理過期定時器的回調函數。

舉例:

setTimeout (()=> console.log ('expired timers'), 1000)

是一個函數,它設置了一個在一定時間后過期的定時器。

因此,如果這個定時器有回調函數的話,那么它們將是事件循環首先處理的函數。

如果計時器稍后到期,在處理其他某個階段的時間內,則只有當事件循環返回到第一階段時,才會調用該計時器的回調。它在所有四個階段都是這樣工作的。

2.I/O輪詢和回調

輪詢基本上意味著搜索準備好處理的新I/O事件,并將其放入回調隊列。理解在Node應用程序的上下文中,I/O只是指網絡和文件訪問之類的事情,這一點至關重要。

舉例:

fs.readFile('file.txt', (e, d)) =>

console.log(‘File read’)

})

在這個階段,99%的代碼都會被執行,因為在典型的Node應用程序中,我們需要做的大部分工作都與網絡和讀取文件有關。

3.setImmediate回調

如果我們想在輪詢和執行階段的I/O之后立即處理回調,我們使用這個特殊的計時器。這在一些更高級的情況下可能是重要的。

setImmediate(() => setImmediate(() =>

console.log('immediate');

});

4.close回調

在這個階段,所有的close關閉事件都會被處理,例如,當一個Web服務器關閉時。這就完成了事件循環的第四個階段。

注意:Node.js事件循環內部還使用了其他事件,但就本文而言,以上四個事件對我們來說是至關重要的。

如上所述,我們完成了這個過程,這只是事件循環中的一個周期。循環結束后,Node.js決定是繼續循環還是退出循環。

Node只是通過檢查是否有任務(例如定時器或I/0任務)仍然在后臺運行來做到這一點。如果沒有,它就會退出應用程序。如果有待處理的任務,它們會繼續處理下一個任務,例如處理HTTP請求或讀取文件。

這基本上就是Node事件循環的全部內容。

四、避免阻塞事件循環

因為Node.js中的所有內容最終都運行在單個線程中,你可以讓數百萬用戶同時訪問同一個池,這使得Nde.js非常輕量級和可擴展。但與此同時,它有阻塞單個線程的危險,這將使整個應用程序變慢,甚至停止應用程序。

五、避免阻塞事件循環的一些準則

作為開發人員,你有責任避免事件循環的阻塞。下面的這些準則可以幫助你避免阻塞事件循環。

  • 不要在回調函數中使用fs、crypto和Zlib模塊中函數的同步版本。
  • 處理較大的對象時,使用JSON時要小心。
  • 不要使用過于復雜的正則表達式(例如,嵌套的量詞)。
  • 不要在嵌套對象上執行復雜的計算。

六、關于Node.js事件循環的最后思考

事件循環使Node.js中的異步編程成為可能。這使得它成為Node設計中最重要的特性。這使得Node.js與其他平臺完全不同。

它負責處理所有傳入的事件,并通過將較重的任務轉到線程池并自己執行最簡單的工作來執行編排。

原文鏈接:https://hackernoon.com/how-do-event-loops-in-nodejs-work

譯者介紹

盧鑫旺,51CTO社區編輯,編程語言愛好者,對數據庫,架構,云原生有濃厚興趣。?

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2024-01-05 08:49:15

Node.js異步編程

2021-05-27 09:00:00

Node.js開發線程

2021-10-22 08:29:14

JavaScript事件循環

2012-02-03 09:25:39

Node.js

2021-12-18 07:42:15

Ebpf 監控 Node.js

2011-09-08 14:16:12

Node.js

2011-09-08 13:46:14

node.js

2021-06-10 07:51:07

Node.js循環機制

2023-10-04 07:35:03

2023-03-02 23:09:53

Node.jsC++JS

2011-09-02 14:47:48

Node

2020-01-03 16:04:10

Node.js內存泄漏

2021-12-08 07:55:41

EventLoop瀏覽器事件

2011-09-09 14:23:13

Node.js

2021-05-21 09:36:42

開發技能代碼

2016-08-11 14:02:02

NodeJS前端

2020-04-15 15:48:03

Node.jsstream前端

2022-09-04 15:54:10

Node.jsAPI技巧

2018-10-19 07:37:07

2020-05-29 15:33:28

Node.js框架JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本人做爰大片免费观看一老师 | 日韩电影免费在线观看中文字幕 | 久久久久久久久久性 | 亚洲精品在线国产 | 成人深夜福利 | 国产日韩欧美在线观看 | 亚洲综合在线视频 | 97色在线观看免费视频 | 国产精品欧美一区二区三区 | 国产精品美女久久久久久久久久久 | 青青久草 | 91正在播放 | 99精品99 | 久久99国产精品 | 欧美午夜精品久久久久久浪潮 | 精品在线一区 | 99视频在线 | 午夜精品一区二区三区免费视频 | 日日骚av| 夜夜爆操| 免费视频成人国产精品网站 | 亚洲美女视频 | 中文字幕免费在线 | 亚洲一区二区三区免费 | 瑟瑟激情 | 天天操综合网站 | 尤物在线精品视频 | 久久免费大片 | 国产欧美日韩在线一区 | 中文字幕久久精品 | 日韩在线免费电影 | 国产日韩91 | 亚洲国产在| 91精品一区二区三区久久久久 | 国产成人小视频 | 亚洲高清av在线 | 国产成人在线视频 | 国产区精品| 日本精品一区二区三区在线观看视频 | 99久久精品视频免费 | 中文字幕啪啪 |