人人都能学会的Nodejs异步IO模型

179 阅读3分钟

Nodejs异步IO模型

Node.js 的异步 I/O 模型简单来说是一种基于事件循环非阻塞 I/O 操作的高性能并发处理机制。

通过了解这个模型,我们就能够初步探索Nodejs的运行机制,也就不至于在把玩Node时把它仅仅当做一个黑箱来看待了。

其模型由四个元素组成:请求对象、IO线程池、观察者、事件循环

一、请求对象

请求对象顾名思义是一个对象,它内部封装了用户的异步操作,如操作类型、参数、请求结果、获取到的结果数据和回调函数等。

Nodejs在用户发起异步操作时会将这些信息都包装进请求对象中去,请求对象是异步IO模型的核心数据结构,有了这个对象,模型中就如同有了流动的血液,可以将IO线程池、事件循环、观察者等联系到一起。

二、IO线程池

有时我们会说Nodejs是单线程的,但这并不完全准确,事实上我们说Node是单线程是从Javascript的层面去说的,运行Javascript的线程确实只有一个。但实际上Nodejs中确实存在多个线程,Node.js 通过 libuv 库实现了一个 I/O 线程池,它由多个工作线程组成,这些线程负责执行底层的 I/O 操作,如文件读写、网络请求等,IO线程池往往通过获取请求对象的方式来得知用户的操作,并作出处理,在处理完成后(如获取到了网络请求的数据)就会通过IOCP(可以理解为Windows中的一种异步处理机制)来给到观察者数据。

三、观察者

观察者主要用于监听用户IO操作的状态,每当IO线程池处理完用户的异步操作后,会将请求对象交给观察者,观察者会负责将已完成的请求对象添加到事件队列中,等待事件循环调用回调函数,观察者就像是一个管道连接着IO线程池和事件循环。

四、事件循环

Nodejs和Javascript中的事件循环基本上是相似的,都是一个循环的结构,不断地检查循环并执行待处理的事件,主要就是做了两件事:

一、通过观察者获取请求对象 二、执行其中的回调函数。

Node餐厅

读到这里你可能都能看懂我在说什么,但是还没有理解其中的关系,没关系,我将为你举一个通俗易懂的例子来帮助你理解!

当你走进餐厅并点餐时,服务员首先会记录你的需求,创建一个订单(请求对象) 。里面包含了你的菜品选择、特殊要求和联系方式等信息。创建完订单后,服务员把订单交给餐厅里的厨师团队( I/O 线程池) ,他们分工合作准备菜品。每个厨师(线程)负责处理不同的任务。与此同时,服务员可以继续接待其他顾客,不受厨师工作的影响。

在整个准备过程中,传菜员(观察者)一直在关注厨师(线程池)的工作状态。当厨师完成某道菜品时,传菜员立刻注意到这一点,并将菜品送到相应的餐桌上。而在餐厅的背后,经理(事件循环) 则负责协调整个餐厅的运作。经理始终关注传菜员是否有新的菜品送到餐桌,一旦有新菜品送到,经理就会确保服务员将菜品准确无误地送到你手中,也就是通过回调来将菜品传达给你。

本文用于记录自己的学习过程,欢迎指出错误。