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:/ ...
随机推荐
- 关于ScrollView中嵌套listview焦点滑动问题 解决
(第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...
- STM32外部中断.
void EXTIX_Init(void){ EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructu ...
- CentOS6.5系统软件仓库及挂载NTFS
第一步:下载rpmforge,下载对应的版本,就是对应CentOS版本,还有32位与64位也要对应上.rpmforge拥有4000多种CentOS的软件包,被CentOS社区认为是最安全也是最稳定的一 ...
- linux下rm命令修改,增加回收站功能【笔记】
一个脚本,linux的用户根目录下.bashrc最后加入如下代码,可以修改rm命令,让人们rm时候不再会全部删除,而是会加入到回收站里,以下是根据别人的资料参考修改的,不是原创 加入后,需要sourc ...
- mkdir递归创建目录
mkdir递归创建目录 rmdir递归删除目录 -p:父目录为空时,一并进行创建-v:命令执行结果可视化mkdir -pv /tmp/x/y/zrmdir -p /tmp/x/y/z mkdir -p ...
- vlc分析
vlc的主界面对应的代码在vlc-2.2.1\modules\gui\qt4\main_interface.cpp.在相同目录下的qt4.cpp的module模块open函数里边new出实例: /* ...
- jq 动态判断设备添加对应meta viewport属性内同
1.常见的单位 dip, dp, px, sp之间的区别: dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支 ...
- StringUtils中 isEmpty 和isBlank的区别
StringUtils方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出Nu ...
- JAVA类访问URL
URI uri = new URI("https://www.baidu.com/"); Desktop desktop = null; if (Des ...
- JAVA基础知识之Set集合
Set集合的基本特征是不记录添加顺序,不允许元素重复(想想是为什么).最常用的实现类是HashSet. 本文将要介绍以下内容 HashSet类 HashSe的特征 HashSet的equals和has ...