Node.js 中的 异步 I/O

简介: Node.js 中的 异步 I/O

异步 I/O

异步 I/O 实现现状

  • 异步 I/O 与 非阻塞 I/O

    • 操作系统内核对于 I/O 只有两种方式:阻塞与非阻塞
    • 阻塞 I/O 造成 CPU 等待浪费,非阻塞则需要轮询去确认是否完全完成数据获取,让 CPU 处理状态判断,对 CPU 资源造成浪费
    • 现存轮询技术

      • read
      • select
      • poll
      • epoll
      • kqueue
  • 理想的非阻塞异步 I/O

    完美的异步 I/O 应该是应用程序发起非阻塞调用,无须通过遍历或者事件唤醒等方式轮询,可以直接处理下一个任务,只需在 I/O 完成后通过信号或回调将数据传递给应用程序即可。

Node 异步 I/O

  • 事件循环
  • 观察者

    • 每个事件循环中有一个或者多个观察者,而判断是否有事件要处理的过程就是向这些观察者询问是否有要处理的事件
    • 事件循环是 生产者/消费者 模型。异步 I/O、网络请求等是事件的生产者,源源不断为 Node 提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理。
  • 请求对象

    • JS 发起调用到内核执行完 I/O 操作的过程中,存在一种中间产物——请求对象
  • 执行回调

    • I/O 观察者回调函数的行为就是取出请求对象的 result 属性作为参数,取出 oncomplete_sym 属性作为方法,然后调用执行,以此达到调用 JavaScript 中传入的回调函数的目的

非 I/O 的异步 API

  • 定时器 setTimeout() setInterval()

  • process.nextTick()
// 立即异步执行一个任务
setTimeout(function() {
  // Todo
}, 0); // 需动用红黑树、创建定时器对象和迭代等操作,较为浪费性能

process.nextTick(function() {
  // Todo
}); // 更高效 复杂度为 O(1)
  • setImmediate()

    • process.nextTick() 类似,但是其属于 check 观察者,回调优先级低
    • process.nextTick() 的回调函数保存在一个数组中,而 setImmediate() 的结果是保存在链表中。process.nextTick()在每轮循环中会将数组中回调全部执行,而 setImmediate() 在每轮循环中执行链表中的一个回调函数

事件驱动与高性能服务器

相关文章
|
9天前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
10天前
|
JSON 前端开发 JavaScript
一文看懂 JavaScript 异步相关知识
一文看懂 JavaScript 异步相关知识
|
1月前
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
27 1
|
2月前
|
数据采集 JavaScript 前端开发
NodeJS技巧:在循环中管理异步函数的执行次数
在Node.js网络爬虫开发中,管理异步函数执行次数是关键。利用Promise.all、async/await或async库能优雅地控制并发。示例展示如何用async/await配合代理IP抓取数据,避免触发反爬策略。在循环中,每个异步请求只执行一次,保证请求有序进行,提高爬虫的稳定性和效率。通过正确的方法,可以有效应对网络爬虫的挑战。
NodeJS技巧:在循环中管理异步函数的执行次数
|
1月前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
37 5
|
2月前
|
数据采集 JavaScript Python
【JS逆向课件:第十三课:异步爬虫】
回调函数就是回头调用的函数
|
26天前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
|
1月前
|
前端开发 JavaScript
JavaScript——promise 是解决异步问题的方法嘛
JavaScript——promise 是解决异步问题的方法嘛
30 0
|
1月前
|
JavaScript 前端开发
JS:一篇文章带你搞懂什么是异步
JS:一篇文章带你搞懂什么是异步
|
前端开发
node.js异步控制流程 回调,事件,promise和async/await
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观。 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用。 接下来是解析,为什么我会有这样的结论 首先是回调,理解上最简单,就是我把任务分配出去,当你执行完了...
1646 1