资讯专栏INFORMATION COLUMN

[译]事件循环,Node.js背后的核心概念

Meils / 2912人阅读

摘要:事件处理器,则是当指定事件触发时,执行的一段代码。事件循环以一个无限循环的形式启动,存在于二进制文件里函数的最后,当没有更多可被执行的事件处理器时,它就退出。

前言

如果你了解过Node.js,那么你一定听说过事件循环。你一定想知道它为什么那么特殊,并且为什么你需要关注它?此时此刻的你,可能已经写过许多基于Express.js的后端代码,但没有接触到任何的循环。

在下文中,我们会先在一个更高的,无关操作系统的层面上了解事件循环,然后再去深入到Node.js中观察它。

事件和事件处理器

在事件循环里,有两个主要角色:

事件

事件处理器,即这些事件的订阅者

事件,可以是十分底层的操作系统事件,如“文件已经准备好被写入”或“收到了一个新的HTTP请求”。
事件处理器,则是当指定事件触发时,执行的一段代码。

事件循环中,事件的获取和事件处理器的执行

事件循环的职责,就是不断得等待事件的发生,然后将这个事件的所有处理器,以它们订阅这个事件的时间顺序,依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。

当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。

即如果某个事件绑定了两个处理器,那么第二个处理器会在第一个处理器执行完毕后,才开始执行。在这个事件的所有处理器都执行完毕之前,事件循环不会去检查是否有新的事件触发。在单个线程中,一切都是有顺序地一个一个地执行的!

在事件处理器的执行代码中触发了事件

一个有趣而且常会出现的情况是,在执行一个事件处理器的代码里,代码触发了另一个事件。例如,在文件可以被读之后,这个事件的处理器开始读取内容,期间处理器又触发了一个写事件,来将这个文件中已读取的这部分内容响应给正在处理的HTTP请求。写入完毕之后,继续读取文件。这就是事件循环保持运作的方式。

事件被触发,然后以订阅顺序执行处理器,不断往复。这个循环圈就是事件循环控制流的关键 ,在没有更多的订阅事件的处理器之后,Node.js就会退出。

操作系统的帮助

事件在实质上是从哪里来?事件循环会不断获取下一个被触发的事件,这是如何发生的?你是对的,这需要操作系统的帮助。幸运的是,现代操作系统中有许多方式可以实现这些(selectepollkqueueIOCP)。在日常使用时,通常会在操作系统提供的这些方式上会再抽象出一层(在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/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85993.html

相关文章

  • [] Node.js 架构概览

    摘要:文件系统请求和相关请求都会放进这个线程池处理其他的请求,如网络平台特性相关的请求会分发给相应的系统处理单元参见设计概览。 译者按:在 Medium 上看到这篇文章,行文脉络清晰,阐述简明利落,果断点下翻译按钮。第一小节背景铺陈略啰嗦,可以略过。刚开始我给这部分留了个 blah blah blah 直接翻后面的,翻完之后回头看,考虑完整性才把第一节给补上。接下来的内容干货满满,相信对 N...

    antyiwei 评论0 收藏0
  • []你并不知道Node

    摘要:问题什么是调用栈并且它是的一部分么调用栈当然是的一部分。为什么理解是重要的因为你在每个进程中只能获取一个调用栈。它是一个从事件队列中跳去事件的循环并且将它们的回调压入到调用栈中。当调用栈为空的时候,事件循环可以决定下一步执行哪一个。 你并不知道Node 原文:You don’t know Node 译者:neal1991 welcome to star my articles-tra...

    miqt 评论0 收藏0
  • node js event loop part 1.1

    原文 先说1.1总揽: Reactor模式 Reactor模式中的协调机制Event Loop Reactor模式中的事件分离器Event Demultiplexer 一些Event Demultiplexer处理不了的复杂I/O接口比如File I/O、DNS等 复杂I/O的解决方案 未完待续 前言 nodejs和其他编程平台的区别在于如何去处理I/O接口,我们听一个人介绍nodejs,总是...

    macg0406 评论0 收藏0
  • 」JavaScript 究竟是如何工作?(第一部分)

    摘要:文章的第二部分涵盖了内存管理的概念,不久后将发布。的标准化工作是由国际组织负责的,相关规范被称为或者。随着分析器和编译器不断地更改字节码,的执行性能逐渐提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 译者:Chor showImg(https://segmentfault.com/img...

    Youngdze 评论0 收藏0
  • []Webpack奇妙世界

    摘要:相反,解释背后的原理是什么使他比一个构造器更加强大。仍然是构造器类似这样的工具存在的主要原因之一就是解决依赖问题。是一个模块构造器,就是前文所说的。 Webpack是一个JavaScript模块构造器。 这是适合它功能的名称。 但是,我想在本文中展现Webpack的真正功能。 本文将不讲解如何使用Webpack。 相反,解释背后的原理:是什么使他比一个构造器更加强大。 Webpack仍...

    enali 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<