位置: 编程技术 - 正文

浅谈Node.js中的定时器(node.js gui)

编辑:rootadmin

推荐整理分享浅谈Node.js中的定时器(node.js gui),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node .js,nodejsorg,node.js详解,node .js,node .js,node.js gui,node.js的理解,node.js的理解,内容如对您有帮助,希望把文章链接给更多的朋友!

Node.js中定时器的实现

上一篇博文提到,在Node中timer并不是通过新开线程来实现的,而是直接在event loop中完成。下面通过几个JavaScript的定时器示例以及Node相关源码来分析在Node中,timer功能到底是怎么实现的。

JavaScript中定时器功能的特点

无论是Node还是浏览器中,都有setTimeout和setInterval这两个定时器函数,并且其工作特点基本相同,因此下面仅以Node为例进行分析。

我们知道,JavaScript中的定时器并不同于计算机底层的定时中断。中断到来时,当前执行代码会被打断,转去执行定时中断处理函数。而JavaScript的定时器到时,如果当前执行线程没有正在执行的代码,则执行相应的回调函数;如果当前有代码在执行中,JavaScript引擎既不会中断当前代码转去执行回调,也不会开新的线程执行回调,而是当前代码执行完毕之后才去处理。

执行上面的代码,可以看到最终输出的时间并不是ms左右,而是数秒。这说明在循环完成之前,定时回调函数确实没有被执行,而是推迟到了循环结束。实际上在JavaScript代码执行中,所有的事件都无法得到处理,必须等到当前代码全部完成,才能去处理新的事件。这就是为什么在浏览器中运行耗时JavaScript代码时,浏览器会失去响应。为了应对这种情况,我们可以采取Yielding Processes的技巧,将耗时的代码分成小块(chunks),每处理完一块就执行一次setTimeout,约定在一小段时间后才处理下一块,而在这段空闲时间里,浏览器/Node可以去处理排队中的事件。

补充资料

在JavaScript 高级程序设计 第三版第章高级技巧中对高级定时器以及Yielding Processes有较详细的讨论。

Node中的timer实现

libuv对uv_loop_t类型的初始化

上一篇博文提到Node会调用libuv的uv_run函数启动default_loop_ptr进行事件调度,default_loop_ptr指向一个uv_loop_t类型的变量default_loop_struct。Node启动时会调用uv_loop_init(&default_loop_struct)对其进行初始化,uv_loop_init函数节选如下:

可以看到loop的time字段先被赋值为0,之后调用uv_update_time函数,这会将最新的计数时间赋给loop.time。

初始化完成之后,default_loop_struct.time就有了一个初始值,与时间有关的操作都会与此值进行比较从而确定是否调用相应回调函数。

浅谈Node.js中的定时器(node.js gui)

libuv的事件调度核心

前面提到uv_run函数就是libuv库实现event loop的核心部分,下面是其流程图:

这里简述一下上面与定时器相关的逻辑:

更新当前loop的time字段,这个字段标志着当前loop概念下的“现在”;

检查loop是否alive,也就是说检查loop中是否还有需要处理的任务(handlers/requests),如果没有就不必循环了;检查注册过的timer,如果某一个timer中指定的时间落后于当前时间了,说明该timer已到时,于是执行其对应的回调函数;执行一次I/O polling(即阻塞住线程,等待I/O事件发生),如果在下一个timer到期时还没有任何I/O完成,则停止等待,执行下一个timer的回调。

如果发生了I/O事件,则执行对应的回调;由于执行回调的时间里可能又有timer到期了,这里要再次检查timer并执行回调。(实际上(4.)这里比较复杂,不仅仅是一步操作,这样描述仅是为了不涉及其他细节,而专注于timer的实现。)Node会一直调用uv_run直到loop不再alive。

Node中的timer_wrap与timers

Node中有一个TimerWrap类,被注册为Node内部的timer_wrap模块。

NODE_MODULE_CONTEXT_AWARE_BUILTIN(timer_wrap, node::TimerWrap::Initialize)其中TimerWrap类基本上就是对uv_timer_t的一个直接封装,NODE_MODULE_CONTEXT_AWARE_BUILTIN是Node用于注册built-in模块的宏。

经过这一步操作,JavaScript就可以拿到这个模块进行操作了。src/lib/timers.js文件使用JavaScript的形式把timer_wrap的功能封装起来,并导出了exports.setTimeout, exports.setInterval, exports.setImmediate等函数。

Node启动与global初始化

上一篇提到Node启动时会载入执行环境LoadEnvironment(env),这个函数中非常重要的一步就是载入src/node.js并执行,src/node.js会载入指定的模块并初始化global和process。当然,setTimeout等函数也会被src/node.js绑定到global对象上。

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

Node.js事件驱动 Node.js事件驱动实现概览虽然在ECMAScript的标准里并没有(也没有必要)明确规定事件,但是在浏览器中,事件作为一个极为重要的机制,给予JavaScript响

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

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

标签: node.js gui

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

上一篇:在Ubuntu系统上安装Ghost博客平台的教程(ubuntu20.04怎么安装)

下一篇:Node.js事件驱动(node drain事件)

  • 增值税申报表上的销售收入
  • 什么是应付职工薪酬设定提存计划
  • 农产品进项税额抵扣最新政策
  • 增值税有哪几类
  • 甲企业持有乙企业的非上市股票2000股
  • 个税身份证验证不通过已经申报缴税
  • 个人独资企业法人可以变更吗?
  • 电子发票丢失如何税前扣除
  • 当天收入支出日报表怎么做
  • 营改增是什么时候提出的
  • 销售自产自销的产品要交税吗?
  • 部分预收账款会计科目
  • 支付宝手续费由谁承担
  • 发票已抵扣是什么意思
  • 差旅补贴需要缴纳个税吗
  • 营改增后机械设备租赁需缴纳什么税?
  • 个体户交地税
  • 金税盘用途
  • 税收分类编码里的劳务是劳务派遣的意思吗
  • 发票税率开错怎么处理?
  • 什么凭证需要审计报告
  • 典当行的账务处理会计分录大全
  • 坏账准备年末结账要结清吗
  • 房地产企业预缴增值税什么时候结转
  • 专用发票没有写购买方电话号码
  • 没有收入能结转损益吗
  • 微信提现收取手续费多少钱
  • 工厂电线
  • 收支两条线是指
  • 出差的住宿费较高的原因
  • 购买现金支票的工本费计入什么科目
  • 对公账户转到私人账户要手续费吗
  • ipad3性价比
  • 水电费分割单会计分录
  • 职工教育经费是不是教育费附加
  • php array_key_exists() 与 isset() 的区别
  • 合同补充协议印花怎么写
  • 旅行社差额征收 政策
  • 微信公众号认证主体是什么意思
  • ps卸载没反应
  • 个税赡养老人专项扣除 多人
  • 前一个月开的发票怎么查
  • 股东分红缴税期限
  • 企业利润表列报项目有哪些
  • 图文详解塘鲺、鲶鱼的区别介绍
  • mysql一次io
  • 营业执照变更需要本人到场吗
  • sqlserver 恢复数据库
  • 关联表的作用
  • 追索权定义
  • 加计抵减与加计抵消区别
  • 先付款后收到发票
  • 3%减按2%征收增值税是什么意思
  • 录入期初余额的操作方法
  • 购进材料无发票会计分录
  • 建筑单位工伤缴费标准
  • 茶农的茶叶自产自销需要办哪些证
  • 收取招标代理费的规定
  • 职工福利费和工会经费
  • 毛利润利润总额净利润的关系图
  • 银行承兑到期后怎么兑现
  • 转账凭证的编制流程
  • 小企业建账选哪种会计制度
  • sqlserver获取当前年
  • w7系统删除所有东西
  • 微软推送win10更新 蓝牙
  • 怎么恢复被破坏的文件
  • 低分辨率调高分辨率会模糊吗
  • win7右下角无线网络连接图标不见了
  • 铁嘴啥意思
  • unity锚点
  • js 浏览器全屏
  • jquery mobile ui
  • Node.js中的核心模块包括哪些内容?
  • shell脚本实现自动化巡检报警发送邮箱
  • 尽有可能的拼音
  • 天津市车船税收费标准2023
  • 进口汽车增值税怎么算
  • 取消税控盘服务费
  • 新办纳税人是什么多久之内
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设