Node.js 事件循环(Event Loop)介绍
Node.js 事件循环(Event Loop)介绍
JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”。Node.js在JavaScript的基础上实现,同样是单线程运行的语言。在单线程中要解决高并发的问题,就要采用非阻塞、异步编程的方式。简单的说,就是在非常耗时的I/O操作中,采用非阻塞的方式继续执行后续的代码,并且进入事件循环(Event Loop)。当I/O操作完成,程序会通过回调函数的方式通知原操作。
1. 事件驱动模式
事件驱动编程是一种广泛使用的编程模型,事件驱动编程可以理解为通过事件或状态的变化来实现程序流程的控制。
1.1 DOM中的事件驱动
在DOM中, 通过添加事件监听的方式来响应'click'、'change'等事件。
在DOM0级中,可以使用以下方式添加事件监听:
在DOM2级中,可以使用以下方式添加事件监听:
DOM对事件的处理,这在本质上是一种事件驱动编程模式。在上面示例中,对按钮添加了'click'事件处理程序(回调函数),在用户点击按钮时会调用指定的处理程序。
1.2 Node.js中的事件驱动
事件驱动模式是Node.js实现高并发关键点之一。Node.js的事件机制由EventEmitter模块实现,Node中很多可以发送事件的核心模块都继承自该模块。
在Web服务器中,我们可以使用以下方式来处理用户请求:
在上例中,我们为server添加了'request'事件上监听。当收到用户请求时该事件对应的回调函数会被调用,在回调函数中可以进行用户请求的处理与响应等操作。
传统Web服务器处理用户请求时,用户请求只能依次处理,如果处理时间较长会造成请求的阻塞。不同于传统的Web服务器,事件驱动使得Node创建的Web服务器非常的高效,用户不必须等待上个用户请求处理完成,就可以接收新的请求,并在处理完成后调用对应回调函数响应请求即可。事件驱动和回调机制赋予了Node.js强大并发处理能力。
2. 事件循环机制
Node.js的事件循环是靠一个单线程不断地查询队列中是否有事件,当读取到事件时,将调用与这个事件关联的回调函数。上面介绍的事件驱动编程是事件循环的具体表现形式,如:在前面创建Web服务器中,回调函数是一个I/O操作;Node.js会监听3000端口是否有HTTP连接,当收到连接时会启动这个I/O操作,但不会等待操作的完成而是继续查看是否有下一个事件,如果有则继续依次处理。
Node.js的事件循环机制由以下几部分组成:
事件生产者:Node.js通过EventEmitter模块发送事件,发送的事件会被放到事件队列中。
事件队列:事件队列(Event Queue)是一个FIFO模型,一端用于接收推入的事件,另外一端拉出要处理的事件。
事件循环:事件循环(Event Loop)是Node.js事件机制的关键点,它一个单线程运行的任务,会不断轮询事件队列,并将轮询到的事件放到线程池中进行处理。
线程池:线程池(Thread Pool)是真正执行事件和任务处理的位置,比较耗时的操作如:网络I/O、文件操作I/O及其它会引起阻塞的操作都会在这里处理。处理完成后,会调用事件对应的回调函数。

在Node的底层有一个libuv库,它实现了事件循环和线程池等功能。线程池是系统级别任务处理,也就是说事件的实际处理里是在更底层系统级完成的,在这一过程中并不是单线程的。处理完成后,线程池会调用与之绑定的回调函数,这样处理结果又被传回到了Node中。
Node.js 事件循环(Event Loop)介绍的更多相关文章
- JS事件循环(Event Loop)机制
前言 众所周知,为了与浏览器进行交互,Javascript是一门非阻塞单线程脚本语言. 为何单线程? 因为如果在DOM操作中,有两个线程一个添加节点,一个删除节点,浏览器并不知道以哪个为准,所以只能选 ...
- 浏览器与Node的事件循环(Event Loop)有何区别?
前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的. 一.线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里 ...
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...
- Node.js 事件循环机制
Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
- 事件循环 event loop 究竟是什么
事件循环 event loop 究竟是什么 一些概念 浏览器运行时是多进程,从任务管理器或者活动监视器上可以验证. 打开新标签页和增加一个插件都会增加一个进程,如下图:  浏览器渲染进程是多线程,包 ...
- 事件循环Event loop到底是什么
摘要:本文通过结合官方文档MDN和其他博客深入解析浏览器的事件循环机制,而NodeJS有另一套事件循环机制,不在本文讨论范围中.process.nextTick和setImmediate是NodeJS ...
- 6、Node.js 事件循环
#########################################################################################Node.js 事件循 ...
- 简单了解一下事件循环(Event Loop)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
随机推荐
- ASP.NET输出流至少要有256个字节的数据后Response.Flush方法才会生效
很多时候我们写的asp.net程序会因为做很多操作,所以会花上一分钟甚至几分钟时间.为了使软件使用者能够耐心的等待程序的执行,我们经常会希望有一个进度条来表示程序执行的状态.或者最起码要显示一个类似: ...
- 集成Spring事物管理
什么是事物 事物是访问数据库的一个操作序列,数据库应用系统通过事物集来完成对数据库的存取.事物的正确执行使得数据库从一种状态转换为另一种状态. 事物必须服从ISO/IEC所制定的ACID原则.ACID ...
- [转]编译Android源代码常见错误解决办法
1. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when ...
- Spring之AOP面向切片
一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...
- D5转Xe点滴
1. VarIsNull 函数已经被 Variants 单元, 相应的 Var 相关都放在哪 2.原本在 SysUtils 下的部分格式函数或定义,例如 .DecimalSeparator: Sho ...
- 【python cookbook】【数据结构与算法】2 从任意长度的可迭代对象中分解元素
从某个可迭代对象中分解出N个元素,但是可迭代对象的长度可能超过N,会出现“分解值过多”的异常: 使用“*表达式”来解决该问题: Python 3.4.3 (v3.4.3:9b73f1c3e601, F ...
- 6*17点阵的Window程序, Java写的。
package com.wulala; import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;imp ...
- wghd的git代码仓库分支管理说明【转】
英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...
- vs2010 仿XCode风格的头注释宏
Sub DocumentFileHeader() Dim star As String star = "//***************************************** ...
- memcache缓存的使用
今天在,本地测试了一个关于memcache的demo. 本地集成环境(wamp)环境如下:php 5.5.12 .Apache 2.4.9 .mysql 5.6.17 1.除了添加配置.添加php的 ...