广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node.js事件驱动
  • 173
分享到

Node.js事件驱动

事件Nodejs 2022-06-04 17:06:31 173人浏览 独家记忆
摘要

Node.js事件驱动实现概览 虽然在ECMAScript的标准里并没有(也没有必要)明确规定“事件”,但是在浏览器中,事件作为一个极为重要的机制,给予javascript响应用户操作与DOM变化的能力;在

Node.js事件驱动实现概览

虽然在ECMAScript的标准里并没有(也没有必要)明确规定“事件”,但是在浏览器中,事件作为一个极为重要的机制,给予javascript响应用户操作与DOM变化的能力;在node.js中,异步事件驱动模型则是其高并发能力的基础。

学习JavaScript也需要了解它的运行平台,为了更好的理解JavaScript的事件模型,我打算从node及浏览器引擎源码入手,分析其底层实现,并将我的分析整理为一系列博文;一方面作为笔记,另一方面也希望能与大家交流,分析和理解有疏漏偏颇之处,还望各位斧正。

简述事件驱动模型

解释JavaScript事件模型本身的好文章已经很多了,可以说这已经是一个说烂了的话题,这里我只简单写一下,并且提供一些好文章的链接。

程序如何响应事件

我们的程序响应外部的事件有如下两种方式:

中断

操作系统处理键盘等硬件输入就是通过中断来进行的,这个方式的好处是即使没有多线程,我们也可以放心地执行我们的代码,CPU收到中断信号之后自动地转去执行相应的中断处理程序,处理完成后会恢复原来的代码的执行环境继续执行。这种方式需要硬件的支持,一般来说都会被操作系统封装起来。

轮询

循环检测是否有事件发生,如果有就去执行相应的处理程序。这在底层和上层的开发中都有应用。
windows窗口程序就需要在主线程中写下如下代码,通常称做消息循环:


MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

消息循环不断检测是否有消息(用户的UI操作、系统消息等)出现,有的话就分发消息,调用相应的回调函数进行处理。
轮询方式的一个缺点就是:如果在主线程的消息循环里进行耗时操作,程序就无法及时响应新的消息。这在JavaScript中表现明显,以后还会提到这一点,并探讨其解决方案。

然而JavaScript中并没有类似消息循环代码,我们只是简单地注册事件,然后等待被调用。这是因为浏览器、Node作为执行平台,已经将event loop实现了,JavaScript代码不需要介入到这个过程中,只需要作为被调用者安静地等待即可。

Node中的event loop

通过Node源码看event loop的实现

Node采用V8作为JavaScript的执行引擎,同时使用libuv实现事件驱动式异步I/O。其事件循环就是采用了libuv的默认事件循环。

在src/node.cc中,


Environment* env = CreateEnvironment(
    node_isolate,
    uv_default_loop(),
    context,
    arGC,
    argv,
    exec_argc,
    exec_argv);

这段代码建立了一个node执行环境,可以看到第三行的uv_default_loop(),这是libuv库中的一个函数,它会初始化uv库本身以及其中的default_loop_struct,并返回一个指向它的指针default_loop_ptr。
之后,Node会载入执行环境并完成一些设置操作,然后启动event loop:


bool more;
do {
 more = uv_run(env->event_loop(), UV_RUN_ONCE);
 if (more == false) {
  EmitBeforeExit(env);
  // Emit `beforeExit` if the loop became alive either after emitting
  // event, or after running some callbacks.
  more = uv_loop_alive(env->event_loop());
  if (uv_run(env->event_loop(), UV_RUN_NOWaiT) != 0)
   more = true;
 }
} while (more == true);
code = EmitExit(env);
RunAtExit(env);
...

more用来标识是否进行下一轮循环。

env->event_loop()会返回之前保存在env中的default_loop_ptr,uv_run函数将以指定的UV_RUN_ONCE模式启动libuv的event loop。在这种模式下,uv_run会至少处理一个事件:这意味着,如果当前事件队列中没有需要处理的I/O事件,uv_run会阻塞住,直到有I/O事件需要处理,或者下一个定时器时间到。如果当前没有I/O事件也没有定时器事件,则uv_run返回false。

接下来Node会根据more的情况决定下一步操作:

如果more为true,则继续运行下一轮loop。

如果more为false,说明已经没有等待处理的事件了,EmitBeforeExit(env);触发进程的'beforeExit'事件,检查并处理相应的处理函数,完成后直接跳出循环。

最后触发'exit'事件,执行相应的回调函数,Node运行结束,后面会进行一些资源释放操作。

在libuv中,定时器事件是直接在event loop中处理的,而I/O事件则分为两类:

Network I/O是使用系统提供的非阻塞式I/O解决方案,例如在linux上使用epoll,windows上使用iocP。

文件操作和DNS操作没有(很好的)系统解决方案,因此libuv自建了线程池,在其中进行阻塞式I/O。

另外我们也可以将自定义的函数抛到线程池中运行,在运行结束后主线程会执行相应的回调函数,不过Node并没有将这一项功能加入到JavaScript中,也就是说只用原生Node是无法在JavaScript中开启新的线程进行并行执行的。

以上所述就是本文的全部内容了,希望大家能够喜欢。

--结束END--

本文标题: Node.js事件驱动

本文链接: https://www.lsjlt.com/news/12284.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js事件驱动
    Node.js事件驱动实现概览 虽然在ECMAScript的标准里并没有(也没有必要)明确规定“事件”,但是在浏览器中,事件作为一个极为重要的机制,给予JavaScript响应用户操作与DOM变化的能力;在...
    99+
    2022-06-04
    事件 Node js
  • 快速掌握Node.js事件驱动模型
    一、传统线程网络模型 在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS、Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完...
    99+
    2022-06-04
    模型 快速 事件
  • Node.js中的事件驱动编程详解
    在传统程编程模里,I/O操作就像一个普通的本地函数调用:在函数执行完之前程序被堵塞,无法继续运行。堵塞I/O起源于早先的时间片模型,这种模型下每个进程就像一个独立的人,目的是将每个人区分开,而且每个人在同一...
    99+
    2022-06-04
    详解 事件 Node
  • 理解 Node.js 事件驱动机制的原理
    学习 Node.js 一定要理解的内容之一,文中主要涉及到了 EventEmitter 的使用和一些异步情况的处理,比较偏基础,值得一读。 大多数 Node.js 对象都依赖了 EventEmitter ...
    99+
    2022-06-04
    原理 机制 事件
  • Node.js中事件驱动程序和EventEmitter类有什么用
    这篇文章将为大家详细讲解有关Node.js中事件驱动程序和EventEmitter类有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Nodejs 是单进程单线程应用...
    99+
    2022-10-19
  • javascript是不是事件驱动
    本文小编为大家详细介绍“javascript是不是事件驱动”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript是不是事件驱动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2022-10-19
  • Node.js的非阻塞I/O、异步与事件驱动介绍
    1、Node.js的单线程 非阻塞 I/O 事件驱动 在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建...
    99+
    2022-11-13
  • 详解领域驱动设计之事件驱动与CQRS
    目录一、前言:从物流详情开始二、领域事件2.1、建模领域事件2.2、领域事件代码解读2.3、领域事件的存储2.3.1、单独的EventStore2.3.2、与业务数据一起存储2.4、...
    99+
    2022-11-12
  • javascript的事件驱动是什么
    本篇文章为大家展示了javascript的事件驱动是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。javascript的事件驱动有:1、鼠标单击事件“oncli...
    99+
    2022-10-19
  • 浅谈Redis的事件驱动模型
    Redis 作为一个 Client-Server 架构的数据库,其源码中少不了用来实现网络通信的部分。而你应该也清楚,通常系统实现网络通信的基本方法是使用Socket编程模型,,包括...
    99+
    2022-11-13
  • Oracle事件驱动的调度作业
    Oracle调度作业最常见的用法是基于时间的调度,设置特定的时间调度规则,依据规则在特定的时间点触发作业程序执行,大部分的作业都是这种类型。除此之外,还可以搭建基于事件的调度作业,就是依据特定的事件来触...
    99+
    2022-10-18
  • python之事件驱动与异步IO
      写服务器处理模型的程序时,通常有以下几种模型:  1.每收到一个请求,创建一个新的进程来处理该请求  2.每收到一个请求,创建一个新的线程来处理该请求  3.每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求(协程...
    99+
    2023-01-31
    事件 python IO
  • Node.js的非阻塞I/O、异步与事件驱动实例分析
    今天小编给大家分享一下Node.js的非阻塞I/O、异步与事件驱动实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、...
    99+
    2023-07-02
  • javascript是不是事件驱动的语言
    这篇文章主要介绍“javascript是不是事件驱动的语言”,在日常操作中,相信很多人在javascript是不是事件驱动的语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • javascript的事件驱动机制是什么
    这篇文章主要介绍“javascript的事件驱动机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript的事件驱动机制是什么”文章能帮助大家解决...
    99+
    2022-10-19
  • 浅谈JS和Nodejs中的事件驱动
    目录事件驱动和发布-订阅事件驱动是怎样用在浏览器中的JavaScript的?浏览器中的主题和观察者事件驱动如何用于 Node.js?了解 EventEmitterJavaScript...
    99+
    2022-11-12
  • Redis的事件驱动模型是什么
    这篇文章主要讲解了“Redis的事件驱动模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的事件驱动模型是什么”吧!为什么 Redis 不使用基本的 Socket 编程模型?...
    99+
    2023-06-30
  • 浅谈用java实现事件驱动机制
    由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没...
    99+
    2023-05-31
    java 事件处理机制 ava
  • Javascript中事件驱动的原理是什么
    本篇文章为大家展示了Javascript中事件驱动的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先来看看这样一个应用场景,网页上有个链接,比如说高级搜...
    99+
    2022-10-19
  • SpringBoot实现异步事件驱动的方法
    目录Spring事件驱动 源码实战 在项目实际开发过程中,我们有很多这样的业务场景:一个事务中处理完一个业务逻辑后需要跟着处理另外一个业务逻辑,伪码大致如下: @Service ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作