摘要:事件處理器,則是當指定事件觸發時,執行的一段代碼。事件循環以一個無限循環的形式啟動,存在于二進制文件里函數的最后,當沒有更多可被執行的事件處理器時,它就退出。
前言
如果你了解過Node.js,那么你一定聽說過事件循環。你一定想知道它為什么那么特殊,并且為什么你需要關注它?此時此刻的你,可能已經寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環。
在下文中,我們會先在一個更高的,無關操作系統的層面上了解事件循環,然后再去深入到Node.js中觀察它。
事件和事件處理器在事件循環里,有兩個主要角色:
事件
事件處理器,即這些事件的訂閱者
事件,可以是十分底層的操作系統事件,如“文件已經準備好被寫入”或“收到了一個新的HTTP請求”。
事件處理器,則是當指定事件觸發時,執行的一段代碼。
事件循環的職責,就是不斷得等待事件的發生,然后將這個事件的所有處理器,以它們訂閱這個事件的時間順序,依次執行。當這個事件的所有處理器都被執行完畢之后,事件循環就會開始繼續等待下一個事件的觸發,不斷往復。
當同時并發地處理多個請求時,以上的概念也是正確的,可以這樣理解:在單個的線程中,事件處理器是一個一個按順序執行的。
即如果某個事件綁定了兩個處理器,那么第二個處理器會在第一個處理器執行完畢后,才開始執行。在這個事件的所有處理器都執行完畢之前,事件循環不會去檢查是否有新的事件觸發。在單個線程中,一切都是有順序地一個一個地執行的!
在事件處理器的執行代碼中觸發了事件一個有趣而且常會出現的情況是,在執行一個事件處理器的代碼里,代碼觸發了另一個事件。例如,在文件可以被讀之后,這個事件的處理器開始讀取內容,期間處理器又觸發了一個寫事件,來將這個文件中已讀取的這部分內容響應給正在處理的HTTP請求。寫入完畢之后,繼續讀取文件。這就是事件循環保持運作的方式。
事件被觸發,然后以訂閱順序執行處理器,不斷往復。這個循環圈就是事件循環控制流的關鍵 ,在沒有更多的訂閱事件的處理器之后,Node.js就會退出。
操作系統的幫助事件在實質上是從哪里來?事件循環會不斷獲取下一個被觸發的事件,這是如何發生的?你是對的,這需要操作系統的幫助。幸運的是,現代操作系統中有許多方式可以實現這些(select,epoll,kqueue,IOCP)。在日常使用時,通常會在操作系統提供的這些方式上會再抽象出一層(在Node.js中,就是libuv)。
另一個需要操作系統幫助的,就是事件的訂閱,如注冊在特定的事件發生時需要執行的代碼。這也是事件循環中必須要實現的。
Node.js中的事件循環事件循環是Node.js中非常核心的組成部分,許多Node.js的特性都依賴于它,它既有積極的影響也不好的影響。比如在處理I/O密集任務時的性能提升和缺乏足夠信息量的錯誤堆棧信息。Node.js異步回調驅動的編程范式,便直接是源于事件循環的存在。
每一個Node.js進程中都存在一個事件循環。只要進程存在,它就存在,一直不間斷地調度執行著你程序中的方法和操作系統方法。事件循環以一個無限循環的形式啟動,存在于Node.js二進制文件里main函數的最后,當沒有更多可被執行的事件處理器時,它就退出。它運行于單個線程中,并且事件處理器是一個接一個順序執行的。
原文鏈接http://bytearcher.com/articles/event-loop-10-000ft/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85993.html
摘要:文件系統請求和相關請求都會放進這個線程池處理其他的請求,如網絡平臺特性相關的請求會分發給相應的系統處理單元參見設計概覽。 譯者按:在 Medium 上看到這篇文章,行文脈絡清晰,闡述簡明利落,果斷點下翻譯按鈕。第一小節背景鋪陳略啰嗦,可以略過。剛開始我給這部分留了個 blah blah blah 直接翻后面的,翻完之后回頭看,考慮完整性才把第一節給補上。接下來的內容干貨滿滿,相信對 N...
摘要:問題什么是調用棧并且它是的一部分么調用棧當然是的一部分。為什么理解是重要的因為你在每個進程中只能獲取一個調用棧。它是一個從事件隊列中跳去事件的循環并且將它們的回調壓入到調用棧中。當調用棧為空的時候,事件循環可以決定下一步執行哪一個。 你并不知道Node 原文:You don’t know Node 譯者:neal1991 welcome to star my articles-tra...
原文 先說1.1總攬: Reactor模式 Reactor模式中的協調機制Event Loop Reactor模式中的事件分離器Event Demultiplexer 一些Event Demultiplexer處理不了的復雜I/O接口比如File I/O、DNS等 復雜I/O的解決方案 未完待續 前言 nodejs和其他編程平臺的區別在于如何去處理I/O接口,我們聽一個人介紹nodejs,總是...
摘要:文章的第二部分涵蓋了內存管理的概念,不久后將發布。的標準化工作是由國際組織負責的,相關規范被稱為或者。隨著分析器和編譯器不斷地更改字節碼,的執行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...
摘要:相反,解釋背后的原理是什么使他比一個構造器更加強大。仍然是構造器類似這樣的工具存在的主要原因之一就是解決依賴問題。是一個模塊構造器,就是前文所說的。 Webpack是一個JavaScript模塊構造器。 這是適合它功能的名稱。 但是,我想在本文中展現Webpack的真正功能。 本文將不講解如何使用Webpack。 相反,解釋背后的原理:是什么使他比一個構造器更加強大。 Webpack仍...
閱讀 3070·2023-04-25 16:50
閱讀 904·2021-11-25 09:43
閱讀 3512·2021-09-26 10:11
閱讀 2518·2019-08-26 13:28
閱讀 2531·2019-08-26 13:23
閱讀 2419·2019-08-26 11:53
閱讀 3566·2019-08-23 18:19
閱讀 2987·2019-08-23 16:27