学习
实践
活动
工具
TVP
写文章
原创

异步I/O

异步I/O

为什么要异步 I/O

在跨网络的结构下,并发已经是现代编程中的标准配备了

在浏览器中 JavaScript 执行与 UI 渲染共用一个线程

前端通过异步可以消除掉UI阻塞的现象

采用异步并发下载资源

多线程的代价在于创建 线程和执行期线程上下文切换的开销较大

但是串行执行的缺点在于性能

Node在两者之间给出了它的方案

利用单线程,远离多线程死锁、状态同步等问题

利用异 步I/O,让单线程远离阻塞,以更好地使用CPU

异步 I/O 实现现状

非阻塞I/O跟阻塞I/O的差别为调用之后会立即返回

阻塞I/O造成CPU等待浪费

非阻塞带来的麻烦却是需要轮询去确 认是否完全完成数据获取

read

select

poll

epoll

kqueue

Node 的异步 I/O

事件循环

在进程启动时,Node便会创建事件循环,循环执行事件关联的回调

观察者

每个事件循环中有一个或者多个观察者,观察者决定是否要执行事件

请求对象

从JavaScript发起调用到内核执行完I/O操作的 过渡过程中的中间对象

执行回调

组装好请求对象、送入I/O线程池等待执行,实际上完成了异步I/O的第一部分,回调通知是 第二部分。

非 I/O 的异步 API

定时器

实现原理与异步I/O比较类似,只是不需要I/O线程池的参与

定时器的问题在于,它并非精确的

process.nextTick()

setTimeout(fn, 0) 的 方式较为 浪费性能。 实际上, process.nextTick()方法的操作相对较为轻量

每次调用process.nextTick()方法,只会将回调函数放入队列中,在下一轮Tick时取出执行

setImmediate

process.nextTick()中的回调函数执行的优先级要高于setImmediate()

原因在于事件循环对观察者的检查是有先后顺序的

事件驱动与高性能服务器

事件驱动的实质,即 通过主循环加事件触发的方式来运行程序

事件循环是异步实现的核心,它 与浏览器中的执行模型基本保持了一致

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • golang fmt(格式换 I O接口)

    fmt 方法可以大致分为 print, scan两类, 根据基础方法可以构建特定方法。

    copy_left
  • 在Google I / O 2018上观看Flutter

    距离Google I / O 2018仅仅一周之遥,Flutter将在活动中展示风格,包括会话,代码,办公时间,交互式沙箱空间等等。

    flyou

扫码关注腾讯云开发者

领取腾讯云代金券