位置: 编程技术 - 正文

Node.js事件循环(Event Loop)和线程池详解(Nodejs事件循环机制图解)

编辑:rootadmin

推荐整理分享Node.js事件循环(Event Loop)和线程池详解(Nodejs事件循环机制图解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node 事件循环,node 事件循环,node 事件循环,nodejs中的事件循环的执行顺序,Nodejs事件循环机制图解,node.js 事件循环,node.js 事件循环,node.js事件循环是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

Node的“事件循环”(Event Loop)是它能够处理大并发、高吞吐量的核心。这是最神奇的地方,据此Node.js基本上可以理解成“单线程”,同时还允许在后台处理任意的操作。这篇文章将阐明事件循环是如何工作的,你也可以感受到它的神奇。

事件驱动编程

理解事件循环,首先要理解事件驱动编程(Event Driven Programming)。它出现在年。如今,事件驱动编程在UI编程中大量使用。JavaScript的一个主要用途是与DOM交互,所以使用基于事件的API是很自然的。

简单地定义:事件驱动编程通过事件或状态的变化来进行应用程序的流程控制。一般通过事件监听实现,一旦事件被检测到(即状态改变)则调用相应的回调函数。听起来很熟悉?其实这就是Node.js事件循环的基本工作原理。

如果你熟悉客户端JavaScript的开发,想一想那些.on*()方法,如element.onclick(),他们用来与DOM元素相结合,传递用户交互。这个工作模式允许在单个实例上触发多个事件。Node.js通过EventEmitter(事件发生器)触发这种模式,如在服务器端的Socket和 “http”模块中。可以从一个单一实例触发一种或一种以上的状态改变。

另一种常见的模式是表达成功succeed和失败fail。现在一般有两种常见的实现方式。首先是将“Error异常”传入回调,一般作为第一个参数传递给回调函数。第二种即使用Promises设计模式,已经加入了ES6。注* Promise模式采用类似jQuery的函数链式书写方式,以避免深层次的回调函数嵌套,如:

“fs”(filesystem)模块大多采用往回调中传入异常的风格。在技术上触发某些调用,例如fs.readFile()附加事件,但该API只是为了提醒用户,用来表达操作成功或失败。选择这样的API是出于架构的考虑,而非技术的限制。

一个常见的误解是,事件发生器(event emitters)在触发事件时也是天生异步的,但这是不正确的。下面是一个简单的代码片段,以证明这一点。EventEmitter经常表现地很异步,因为它经常用于通知需要异步完成的操作,但EventEmitter API本身是完全同步的。监听函数内部可以按异步执行,但请注意,所有的监听函数将按被添加的顺序同步执行。

机制概述和线程池

Node本身依赖多个库。其中之一是libuv,神奇的处理异步事件队列和执行的库。

Node.js事件循环(Event Loop)和线程池详解(Nodejs事件循环机制图解)

Node利用尽可能多的利用操作系统内核实现现有的功能。像生成响应请求(request),转发连接(connections)并委托给系统处理。例如,传入的连接通过操作系统进行队列管理,直到它们可以由Node处理。

您可能听说过,Node有一个线程池,你可能会疑惑:“如果Node会按次序处理任务,为什么还需要一个线程池?”这是因为在内核中,不是所有任务都是按异步执行的。在这种情况下,Node.JS必须能在操作时将线程锁定一段时间,以便它可以继续执行事件循环而不会被阻塞。

下面是一个简单的示例图,来表示他内部的运行机制:

┌───────────────────────┐?──&#;│ timers │ │ └───────────┬───────────┘ │ ┌───────────┴───────────┐ │ │ pending callbacks │ │ └───────────┬───────────┘ ┌──────────────┐ │ ┌───────────┴───────────┐ │ incoming: │ │ │ poll │&#;──┤ connections, │ │ └───────────┬───────────┘ │ data, etc. │ │ ┌───────────┴───────────┐ └──────────────┘?───┤ setImmediate │ └───────────────────────┘

关于事件循环的内部运行机制,有一些理解困难的地方:

所有回调都会经由process.nextTick(),在事件循环(例如,定时器)一个阶段的结束并转换到下一阶段之前预设定。这就会避免潜在的递归调用process.nextTick(),而造成的无限循环。“Pending callbacks(待回调)”,是回调队列中不会被任何其他事件循环周期处理(例如,传递给fs.write)的回调。

Event Emitter 和 Event Loop

通过创建EventEmitter,可简化与事件循环的交互。它是一个通用的封装,可以让你更容易地创建基于事件的API。关于这两者如何互动往往让开发者感到混乱。

下面的例子表明,忘记了事件是同步触发的,可能导致事件被错过。上面的'thing1'事件,永远不会被MyThing()捕获,因为MyThing()必须在实例化后才能侦听事件。下面的是一个简单的解决方法,不必添加任何额外的闭包:

下面的方案也可以工作,不过要损失一些性能:另一个问题是触发Error(异常)。找出您应用程序中的问题已经很难了,但没了调用堆栈(注* e.stack),则几乎不可能调试。当Error被远端的异步请求调用堆栈将丢失。有两个可行的解决方案:同步触发或确保Error跟其他重要信息一起传入。下面的例子演示了这两种解决方案:审时度势。当error被触发时,是有可能被立即处理的。或者,它可能是一些琐碎的,可以很容易处理,或在以后再处理的异常。此外通过一个构造函数,传递Error也不是一个好主意,因为构造出来的对象实例很有可能是不完整的。刚才直接抛出Error的情况是个例外。

结束语

这篇文章比较浅显地探讨了有关事件循环的内部运作机制和技术细节。都是经过深思熟虑的。另一篇文章会讨论事件循环与系统内核的交互,并展现NodeJS异步运行的魔力。

Node.js中child_process实现多进程 varhttp=require('http');functionfib(n){if(n2){return1;}else{returnfib(n-2)+fib(n-1);}}varserver=http.createServer(function(req,res){varnum=parseInt(req.url.substring(1),);res.writeHead();res.end(

nodejs 整合kindEditor实现图片上传 kindEditor官网上中提供了ASP,ASP.NET,JSP相关的整合应用,

Node.js node-schedule定时任务隔多少分钟执行一次的方法 在Node.js中,我使用node-schedule来执行定时任务。Cron-style的时间格式对于初学者不太直观,所以一般使用这种方式:比如官方示例中的每个小时的分执行

标签: Nodejs事件循环机制图解

本文链接地址:https://www.jiuchutong.com/biancheng/376438.html 转载请保留说明!

上一篇:node.js中的forEach()是同步还是异步呢(Node.js中的construct)

下一篇:Node.js中child_process实现多进程

  • 运输发票税率6%和3%区别在哪
  • 企业结算时待摊费用怎么办
  • 超过开票金额不能开票?
  • 冲红的专票要给购买方吗
  • 管理会计期末存货计算公式
  • 手撕票几个点
  • 自制原始凭证和原始凭证的区别
  • 什么是联营商品
  • 不能计入外购固定资产成本的相关税费
  • 税收用在哪些方面
  • 存货周转率 高
  • 单位聘请的临时工请假旅游
  • 交通费汇算清缴怎么做账
  • 银行定期存款转存
  • 应交税费账户期末借方余额反映的是
  • 费用类发票怎么做账
  • 贸易公司一般纳税多少
  • 增值税普通发票怎么开
  • 小微企业季度超过30万怎么报增值税
  • 单位代扣代缴个人社保
  • 一个企业为另一个企业作证有法力
  • 以货抵债会计处理
  • 一般纳税人增值税申报操作流程
  • 高新技术企业取消资格的程序
  • 多缴纳的增值税怎么申请抵税
  • 生产车间制造费用包括
  • win11dns电脑服务器未响应如何处理
  • 主营业务收入平均增长率计算例题
  • 固定资产计提完折旧怎么处理
  • 在php中,字符串有哪些表示形式
  • 应收账款需要计提坏账准备吗
  • 应付账款收到票怎么做账
  • 其他应付款怎么平账
  • 担保公司代偿账户是什么
  • vue3.0项目
  • php获取文章内容图片
  • Yii2使用表单上传文件的实例代码
  • yolov5怎么改进
  • cvpr2023最佳论文
  • vue使用计算属性声明在什么配置项中
  • js写数组去重
  • 结转成本 凭证
  • 大额的维修费用怎么摊销
  • 弥补以前年度亏损怎么算
  • 车辆购置税属于地方税吗
  • 材料采购会计科目怎么使用
  • 基于python语言
  • python中返回结果为true
  • 国地税合并后工资仍然不一致
  • 记账凭证去根据什么填制
  • 贴现业务受理该怎么做
  • 装修工程一般质保几年
  • sql server游标
  • 劳务公司的成本有哪些
  • 小规模免征增值税到什么时间止
  • 开发票没有银行回单可以入帐吗?
  • 补缴的以前年度的税费怎么记账
  • 材料采购合同要点
  • 公司从员工工资扣水电费
  • 应付职工薪酬要设二级科目吗
  • 专项应付款余额转入资本公积的规定
  • 企业会计准则2023电子版
  • Ubuntu下MySQL及工具安装配置详解
  • Linux下Mysql5.7.19卸载方法
  • CentOS EXT4文件系统的详解
  • u启动怎么装机
  • 在microsoft store
  • 手机苹果操作系统
  • windows临时文件在哪里
  • 怎么在手机上买股票开户
  • ubuntu操作
  • node.js怎么用
  • css下margin、padding、border、background和font缩写示例
  • jquery中ajax处理跨域的三大方式
  • python文件a
  • js制作网页制作步骤
  • 重庆网上申报税务操作流程
  • 工程咨询服务税需要每月缴纳吗
  • 购车强制险包括哪些
  • 消费税的税收筹划案例分析
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设