成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[譯]事件循環(huán),Node.js背后的核心概念

Meils / 2991人閱讀

摘要:事件處理器,則是當(dāng)指定事件觸發(fā)時(shí),執(zhí)行的一段代碼。事件循環(huán)以一個(gè)無(wú)限循環(huán)的形式啟動(dòng),存在于二進(jìn)制文件里函數(shù)的最后,當(dāng)沒(méi)有更多可被執(zhí)行的事件處理器時(shí),它就退出。

前言

如果你了解過(guò)Node.js,那么你一定聽(tīng)說(shuō)過(guò)事件循環(huán)。你一定想知道它為什么那么特殊,并且為什么你需要關(guān)注它?此時(shí)此刻的你,可能已經(jīng)寫(xiě)過(guò)許多基于Express.js的后端代碼,但沒(méi)有接觸到任何的循環(huán)。

在下文中,我們會(huì)先在一個(gè)更高的,無(wú)關(guān)操作系統(tǒng)的層面上了解事件循環(huán),然后再去深入到Node.js中觀察它。

事件和事件處理器

在事件循環(huán)里,有兩個(gè)主要角色:

事件

事件處理器,即這些事件的訂閱者

事件,可以是十分底層的操作系統(tǒng)事件,如“文件已經(jīng)準(zhǔn)備好被寫(xiě)入”或“收到了一個(gè)新的HTTP請(qǐng)求”。
事件處理器,則是當(dāng)指定事件觸發(fā)時(shí),執(zhí)行的一段代碼。

事件循環(huán)中,事件的獲取和事件處理器的執(zhí)行

事件循環(huán)的職責(zé),就是不斷得等待事件的發(fā)生,然后將這個(gè)事件的所有處理器,以它們訂閱這個(gè)事件的時(shí)間順序,依次執(zhí)行。當(dāng)這個(gè)事件的所有處理器都被執(zhí)行完畢之后,事件循環(huán)就會(huì)開(kāi)始繼續(xù)等待下一個(gè)事件的觸發(fā),不斷往復(fù)。

當(dāng)同時(shí)并發(fā)地處理多個(gè)請(qǐng)求時(shí),以上的概念也是正確的,可以這樣理解:在單個(gè)的線程中,事件處理器是一個(gè)一個(gè)按順序執(zhí)行的。

即如果某個(gè)事件綁定了兩個(gè)處理器,那么第二個(gè)處理器會(huì)在第一個(gè)處理器執(zhí)行完畢后,才開(kāi)始執(zhí)行。在這個(gè)事件的所有處理器都執(zhí)行完畢之前,事件循環(huán)不會(huì)去檢查是否有新的事件觸發(fā)。在單個(gè)線程中,一切都是有順序地一個(gè)一個(gè)地執(zhí)行的!

在事件處理器的執(zhí)行代碼中觸發(fā)了事件

一個(gè)有趣而且常會(huì)出現(xiàn)的情況是,在執(zhí)行一個(gè)事件處理器的代碼里,代碼觸發(fā)了另一個(gè)事件。例如,在文件可以被讀之后,這個(gè)事件的處理器開(kāi)始讀取內(nèi)容,期間處理器又觸發(fā)了一個(gè)寫(xiě)事件,來(lái)將這個(gè)文件中已讀取的這部分內(nèi)容響應(yīng)給正在處理的HTTP請(qǐng)求。寫(xiě)入完畢之后,繼續(xù)讀取文件。這就是事件循環(huán)保持運(yùn)作的方式。

事件被觸發(fā),然后以訂閱順序執(zhí)行處理器,不斷往復(fù)。這個(gè)循環(huán)圈就是事件循環(huán)控制流的關(guān)鍵 ,在沒(méi)有更多的訂閱事件的處理器之后,Node.js就會(huì)退出。

操作系統(tǒng)的幫助

事件在實(shí)質(zhì)上是從哪里來(lái)?事件循環(huán)會(huì)不斷獲取下一個(gè)被觸發(fā)的事件,這是如何發(fā)生的?你是對(duì)的,這需要操作系統(tǒng)的幫助。幸運(yùn)的是,現(xiàn)代操作系統(tǒng)中有許多方式可以實(shí)現(xiàn)這些(select,epoll,kqueueIOCP)。在日常使用時(shí),通常會(huì)在操作系統(tǒng)提供的這些方式上會(huì)再抽象出一層(在Node.js中,就是libuv)。

另一個(gè)需要操作系統(tǒng)幫助的,就是事件的訂閱,如注冊(cè)在特定的事件發(fā)生時(shí)需要執(zhí)行的代碼。這也是事件循環(huán)中必須要實(shí)現(xiàn)的。

Node.js中的事件循環(huán)

事件循環(huán)是Node.js中非常核心的組成部分,許多Node.js的特性都依賴于它,它既有積極的影響也不好的影響。比如在處理I/O密集任務(wù)時(shí)的性能提升和缺乏足夠信息量的錯(cuò)誤堆棧信息。Node.js異步回調(diào)驅(qū)動(dòng)的編程范式,便直接是源于事件循環(huán)的存在。

每一個(gè)Node.js進(jìn)程中都存在一個(gè)事件循環(huán)。只要進(jìn)程存在,它就存在,一直不間斷地調(diào)度執(zhí)行著你程序中的方法和操作系統(tǒng)方法。事件循環(huán)以一個(gè)無(wú)限循環(huán)的形式啟動(dòng),存在于Node.js二進(jìn)制文件里main函數(shù)的最后,當(dāng)沒(méi)有更多可被執(zhí)行的事件處理器時(shí),它就退出。它運(yùn)行于單個(gè)線程中,并且事件處理器是一個(gè)接一個(gè)順序執(zhí)行的。

原文鏈接

http://bytearcher.com/articles/event-loop-10-000ft/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85993.html

相關(guān)文章

  • [] Node.js 架構(gòu)概覽

    摘要:文件系統(tǒng)請(qǐng)求和相關(guān)請(qǐng)求都會(huì)放進(jìn)這個(gè)線程池處理其他的請(qǐng)求,如網(wǎng)絡(luò)平臺(tái)特性相關(guān)的請(qǐng)求會(huì)分發(fā)給相應(yīng)的系統(tǒng)處理單元參見(jiàn)設(shè)計(jì)概覽。 譯者按:在 Medium 上看到這篇文章,行文脈絡(luò)清晰,闡述簡(jiǎn)明利落,果斷點(diǎn)下翻譯按鈕。第一小節(jié)背景鋪陳略啰嗦,可以略過(guò)。剛開(kāi)始我給這部分留了個(gè) blah blah blah 直接翻后面的,翻完之后回頭看,考慮完整性才把第一節(jié)給補(bǔ)上。接下來(lái)的內(nèi)容干貨滿滿,相信對(duì) N...

    antyiwei 評(píng)論0 收藏0
  • []你并不知道Node

    摘要:?jiǎn)栴}什么是調(diào)用棧并且它是的一部分么調(diào)用棧當(dāng)然是的一部分。為什么理解是重要的因?yàn)槟阍诿總€(gè)進(jìn)程中只能獲取一個(gè)調(diào)用棧。它是一個(gè)從事件隊(duì)列中跳去事件的循環(huán)并且將它們的回調(diào)壓入到調(diào)用棧中。當(dāng)調(diào)用棧為空的時(shí)候,事件循環(huán)可以決定下一步執(zhí)行哪一個(gè)。 你并不知道Node 原文:You don’t know Node 譯者:neal1991 welcome to star my articles-tra...

    miqt 評(píng)論0 收藏0
  • node js event loop part 1.1

    原文 先說(shuō)1.1總攬: Reactor模式 Reactor模式中的協(xié)調(diào)機(jī)制Event Loop Reactor模式中的事件分離器Event Demultiplexer 一些Event Demultiplexer處理不了的復(fù)雜I/O接口比如File I/O、DNS等 復(fù)雜I/O的解決方案 未完待續(xù) 前言 nodejs和其他編程平臺(tái)的區(qū)別在于如何去處理I/O接口,我們聽(tīng)一個(gè)人介紹nodejs,總是...

    macg0406 評(píng)論0 收藏0
  • 」JavaScript 究竟是如何工作?(第一部分)

    摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國(guó)際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...

    Youngdze 評(píng)論0 收藏0
  • []Webpack奇妙世界

    摘要:相反,解釋背后的原理是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。仍然是構(gòu)造器類似這樣的工具存在的主要原因之一就是解決依賴問(wèn)題。是一個(gè)模塊構(gòu)造器,就是前文所說(shuō)的。 Webpack是一個(gè)JavaScript模塊構(gòu)造器。 這是適合它功能的名稱。 但是,我想在本文中展現(xiàn)Webpack的真正功能。 本文將不講解如何使用Webpack。 相反,解釋背后的原理:是什么使他比一個(gè)構(gòu)造器更加強(qiáng)大。 Webpack仍...

    enali 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<