前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >异步I/O

异步I/O

原创
作者头像
李才哥
修改2021-02-26 17:38:13
8340
修改2021-02-26 17:38:13
举报
文章被收录于专栏:李才哥李才哥

异步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 删除。

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要异步 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()
                  • 事件驱动与高性能服务器
                    • 事件驱动的实质,即 通过主循环加事件触发的方式来运行程序
                      • 事件循环是异步实现的核心,它 与浏览器中的执行模型基本保持了一致
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档