Day8 NodeJS-libuv与Asynchonous

JavaScript是一个Synchronous(同步)执行的语言,以「一次只做一件事」的方式执行,同一时间只能执行一行程序码。NodeJS藉由libuv模组,使JavaScript的应用程序在执行时可以达到Asynchronous(非同步)的效果,可以在同一个时间执行不同的程序码。今天的内容比较偏向概念说明,主要有关libuv模组与NodeJS的非同步。

libuv模组

libuv是一个着重於非同步输入/输出(I/O)的函式库,支援多种平台,最主要的开发目的是用於NodeJS。在libuv模组的运作方式中有两个重要的部分:Event Loop与Queue,当libuv中的函式对电脑的作业系统提出请求(request),作业系统给予的回应事件(Events)会传送到Queue暂存,而等候作业系统给予回应的期间,libuv会透过Event Loop持续向Queue确认是否有事件进入,当事件进入便立即存取。

https://ithelp.ithome.com.tw/upload/images/20210923/20139980AtQdpreFD2.jpg

NodeJS的非同步

在整个系列文的一开始有提到,NodeJS以V8作为执行JavaScript的引擎,是使用同步执行的机制,那NodeJS到底是怎麽达到非同步的/images/emoticon/emoticon70.gif 上面有提到libuv模组的运作逻辑,加入V8的运作方式就可以逐步了解。

由於V8是同步的,因此程序码在执行时需等候前面的程序码执行,而libuv模组经过提出请求的流程後,以Event Loop不断确认回应事件,取得事件後再接着之後的工作,当程序码透过V8执行时,libuv取得事件後会触发回呼函式(callback)以V8执行,同时libuv也持续追踪作业系统的回应成果,使得V8在执行程序码的同时,NodeJS仍可透过libuv进行与作业系统端的工作,因此能让NodeJS得以非同步执行。

https://ithelp.ithome.com.tw/upload/images/20210923/20139980vOtlPCB3IW.jpg

小结

NodeJS中的非同步在请求作业系统执行工作的同时,主程序的程序码也可持续执行,可以避免在应用程序执行时,产生过多的等待时间,也能在多个程序码需要执行的情况下,避免塞车的情况。

参考资料

http://docs.libuv.org/en/v1.x/

Learn and Understand NodeJS [课程]


<<:  【Day 08】- 见鬼了(っ °Д °;)っ我明明没有启动这支程序…

>>:  [Day 18] Leetcode 1328. Break a Palindrome (C++)

[Part 7 ] Vue.js 的精随-元件生命周期 (续)

摧毁阶段 这个阶段负责元件的移除,适合用来移除所有的事件监听以及任何会造成记忆体泄漏(memory ...

Unity与Photon的新手相遇旅途 | Day6-粒子效果应用范例

今天介绍两个粒子效果应用范例,一个是透过按键控制粒子效果生成以及删除,第二个是制作炸弹炸物体产生的效...

【Day 28】Hook 08:useCallback

useCallback 如果父元件所传递的 props 包含 Object, 则在元件因状态改变而 ...

裸机Hyperviser大众化原因

今天来探讨裸机Hyperviser在近几年朝大众化的原因 摆脱固有平台 受够了各大云端运算服务的绑手...

DAY 29『 从相簿选取照片( 有裁剪照片功能 ) 』ImagePicker - Part1

昨天介绍完使用相机拍照,今天会分享如何从相簿选取照片 成品: 拉一个 Button 、 ImageV...