位置: 编程技术 - 正文

Node.js事件驱动(node drain事件)

编辑:rootadmin

推荐整理分享Node.js事件驱动(node drain事件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:什么是node.js中的事件驱动编程?,nodejs 事务,nodejs 事务处理,nodejs 事件驱动,nodejs 事务处理,什么是node.js中的事件驱动编程?,node事件驱动的原理,node事件驱动的原理,内容如对您有帮助,希望把文章链接给更多的朋友!

Node.js事件驱动实现概览

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

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

简述事件驱动模型

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

程序如何响应事件

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

中断

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

轮询

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

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

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

Node中的event loop

Node.js事件驱动(node drain事件)

通过Node源码看event loop的实现

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

在src/node.cc中,

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

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中开启新的线程进行并行执行的。

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

在Node.js中使用HTTP上传文件的方法 开发环境我们将使用VisualStudioExpressforWeb作为开发环境,不过它还不能被用来做Node.js开发。为此我们需要安装Node.jsToolsforVisualStudio。装好后VisualStudioExpr

使用Node.js实现HTTP 内容分片的教程 介绍在本文中,我会阐述HTTP状态分部分内容的基础概念,并使用Node.js一步步地实现它.我们还将用一个基于它用法最常见场景的示例来测试代码:一

使用Raygun对Node.js应用进行错误处理的方法 用我们的raygun4node包,能提供一种把您的Node.js错误发送给Raygun的便利办法.它可以很容仪的使用npm安装:npminstallraygun其能给您提供一个raygun客户端,您可

标签: node drain事件

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

上一篇:浅谈Node.js中的定时器(node.js gui)

下一篇:在Node.js中使用HTTP上传文件的方法(node.js适用哪些场景)

  • 非商业性旅游服务
  • 应交税费的借贷方向
  • 季报现金流量表可以不填吗
  • 发票上的不含税单价怎么算的
  • 空调的折旧年限和残值率
  • 没有社保可以缴费吗
  • 银行承兑汇票手续费是多少
  • 商业汇票的申请人是谁
  • 生产事故造成怎么样赔付
  • 专票当月抵扣后当月作废会被发现吗
  • 个人汽车租赁发票网上怎么开
  • 公司成本票不够交税多少
  • 合同中没有明确违约责任怎么办
  • 项目合作费包括
  • 减少注册资本金程序
  • 企业的低值易耗品主要包括什么等
  • 关税税率表包括哪些税种
  • 怎么向个体工商户贷款
  • 汽车厂家金融贴息 是贴利息的还是贴车价
  • 抽奖得奖
  • 计算内含报酬率所使用的年金现值系数
  • 期末留抵税额怎么做账
  • 直接计入费用的税
  • 坏账收回的会计处理方法
  • 无法访问移动网络怎么办
  • 事业单位福利发放时间
  • 装了win8以后不能上网
  • PHP:Memcached::addServer()的用法_Memcached类
  • PQIMountSvc.exe是什么进程 PQIMountSvc进程查询
  • 查验发票张数超过限制
  • 往来款项账务处理
  • 固定资产可以直接入账吗
  • 固定资产加速折旧方法
  • 项目差旅费能计入项目费用吗
  • 企业所得税核定征收方法有哪两种
  • Yii2 rbac权限控制之菜单menu实例教程
  • php批量导入数据库
  • 微信小程序slot
  • 深度学习:图像去雨网络实现Pytorch (二)一个简单实用的基准模型(PreNet)实现
  • phpcms怎么用
  • 物权变动的原因是什么
  • python中如何合并csv
  • 公司盖厂房没有票要交税吗?
  • 一般纳税人和小规模公司怎么区分
  • 服务业按什么结算工资
  • 小规模纳税人季度不超30万免增值税
  • mysql 增加用户
  • sql查询语句怎么用
  • 律师事务所收到专票能抵扣吗合法吗
  • 收到银行电子汇票已入账怎么做账
  • 营业利润净利润利润总额的区别
  • 实收资本如何计算印花税及附加税
  • 厂房监理要点
  • 暂估商品入库 后收到发票怎么做分录
  • 企业的银行转账多久到账
  • 代扣和代缴的区别
  • 税控设备管理办法
  • 小规模纳税人收到专票的会计分录
  • 材料人工制造费用是什么成本
  • 发票要不回来怎么办
  • 公司开具电子发票是否取消纸质发票开具
  • MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  • sql server的存储方式
  • mysql drop database删除数据库命令实例讲解
  • 电脑怎么安装安卓模拟器
  • win8打开桌面
  • win7资源管理器怎么打开
  • win10命令提示符需要密码
  • 备份mbr引导
  • bootstrap怎么学
  • java4Android(15)处理流的使用示例、装饰者设计模式、节点流和处理流的关系
  • bat error
  • wow 脚本开发
  • 批处理程序删除文件夹中临时文件
  • javascript的sort
  • python中将字典转换为字符串
  • android遇到的难题,怎么解决的
  • 浙江增值税电子普通发票用支付宝怎么开
  • 企业可以享受哪些政策优惠
  • 江苏税务局人工电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设