深入浅出nodejs(第四天)

121 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十九天,点击查看活动详情

深入浅出nodejs(第四天)

I/O异步

异步I/O是什么?

有异步就不得不提另一个概念:同步,这样的理解是错误的,咱们不能以字面的意思去理解它。同步,英文名叫做 Syncjrpmozation 。它是指同一时间只能做一件事情,也就是说一件事情做完了才能做另外一件事情。

  • I/O:input/output,既指文件的读取,又指发送网络请求(相当于读取远程计算机资源了)
  • 异步I/O:先发送I/O相应指令,之后接着执行后续程序,等读取文件或者网络资源完成时,再进行处理

image.png

为什么要异步I/O

  • 用户体验
    为了让用户拥有流畅的体验,在处理前端发来的网络请求时,Node服务器必须尽快执行完代码,返回给前端数据。其中I/O操作又非常耗时。

    • 如果串行读取多个文件,则总耗时为各个资源耗时总和:M+N
    • 若并行读取多个,则总耗时为各资源耗时中最大值:max( M, N )
  • 资源分配

    • 单线程串行:性能差,I/O阻塞CPU计算,资源不能很好利用
    • 多线程并行:创建线程和执行上下文切换开销大

异步的实现

异步的实现

多线程:

线程可以理解成一个应用程序中的执行任务,每一个程序至少会有一个线程,它被成为主线程。如果想实现异步处理,就可以通过开始多个线程,这些线程可以同时执行。只是异步实现的一种方式。

回调函数实现异步

JavaScript 引擎是以单线程的机制来运行代码的。所以在 JavaScript中想要实现异步就只有采用单线程非阻塞式的方式。早期的时候,单线程非阻塞通过回调函数来实现

image.png

Node 的异步I/O

node 实现异步I/O有使事件循环、观察者模式和请求对象等。

1. 事件循环

原理:在进程启动时,Node 便会创建一个类似于while(true)的循环,每执行一次循环体过程我们称之为一个Tick。每个 Tick 的过程就是查看是否有事件待处理,如果有就取出事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下一个循环,如果不再有事件处理,就退出流程。

image.png

2. 观察者

观察者的作用就是用来判断是否有事件要处理。浏览器采用了类似的机制,事件可能来自用户的点击或者加载某些文件时产生,而这些事件都有各自对应的观察者。在 Node 中,事件主要来源于网络请求、文件I/O等,这些事件对应的观察者有文件I/O观察者、网络I/O观察者等。观察者将事件进行了分类。

        事件循环是一个典型的生产者/消费者模型。异步I/O 、网络请求等则是事件生产者,源源不断为Node 提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理。