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() 在每轮循环中执行链表中的一个回调函数

事件驱动与高性能服务器

相关文章
|
1月前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
2月前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。
|
2月前
|
移动开发 JavaScript 前端开发
【JavaScript】JS执行机制--同步与异步
【JavaScript】JS执行机制--同步与异步
28 1
|
3月前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
3月前
|
JSON 前端开发 JavaScript
一文看懂 JavaScript 异步相关知识
一文看懂 JavaScript 异步相关知识
43 4
|
3月前
|
存储 前端开发 JavaScript
node中循环异步的问题[‘解决方案‘]_源于map循环和for循环对异步事件配合async、await的支持
本文探讨了在Node.js中处理循环异步操作的问题,比较了使用map和for循环结合async/await处理异步事件的差异,并提供了解决方案。
46 0
|
4月前
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
41 1
|
4月前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
|
4月前
|
前端开发 JavaScript
JavaScript——promise 是解决异步问题的方法嘛
JavaScript——promise 是解决异步问题的方法嘛
52 0
|
开发框架 JavaScript 网络协议
aLiLua web框架——node.js般的异步处理遇上PHP般的开发效率
aLiLua是基于Lua语言的一款网络服务开发框架, 使用 epoll 进行网络/文件IO事件读写,对Lua协程进行调度,性能高效,使用简单。
222 0
aLiLua web框架——node.js般的异步处理遇上PHP般的开发效率