JavaScript是一个Synchronous(同步)执行的语言,以「一次只做一件事」的方式执行,同一时间只能执行一行程序码。NodeJS藉由libuv
模组,使JavaScript的应用程序在执行时可以达到Asynchronous(非同步)的效果,可以在同一个时间执行不同的程序码。今天的内容比较偏向概念说明,主要有关libuv
模组与NodeJS的非同步。
libuv是一个着重於非同步输入/输出(I/O)的函式库,支援多种平台,最主要的开发目的是用於NodeJS。在libuv模组的运作方式中有两个重要的部分:Event Loop与Queue,当libuv中的函式对电脑的作业系统提出请求(request),作业系统给予的回应事件(Events)会传送到Queue暂存,而等候作业系统给予回应的期间,libuv会透过Event Loop持续向Queue确认是否有事件进入,当事件进入便立即存取。
在整个系列文的一开始有提到,NodeJS以V8作为执行JavaScript的引擎,是使用同步执行的机制,那NodeJS到底是怎麽达到非同步的 上面有提到libuv
模组的运作逻辑,加入V8的运作方式就可以逐步了解。
由於V8是同步的,因此程序码在执行时需等候前面的程序码执行,而libuv
模组经过提出请求的流程後,以Event Loop不断确认回应事件,取得事件後再接着之後的工作,当程序码透过V8执行时,libuv
取得事件後会触发回呼函式(callback)以V8执行,同时libuv也持续追踪作业系统的回应成果,使得V8在执行程序码的同时,NodeJS仍可透过libuv
进行与作业系统端的工作,因此能让NodeJS得以非同步执行。
NodeJS中的非同步在请求作业系统执行工作的同时,主程序的程序码也可持续执行,可以避免在应用程序执行时,产生过多的等待时间,也能在多个程序码需要执行的情况下,避免塞车的情况。
http://docs.libuv.org/en/v1.x/
Learn and Understand NodeJS [课程]
<<: 【Day 08】- 见鬼了(っ °Д °;)っ我明明没有启动这支程序…
>>: [Day 18] Leetcode 1328. Break a Palindrome (C++)
摧毁阶段 这个阶段负责元件的移除,适合用来移除所有的事件监听以及任何会造成记忆体泄漏(memory ...
今天介绍两个粒子效果应用范例,一个是透过按键控制粒子效果生成以及删除,第二个是制作炸弹炸物体产生的效...
useCallback 如果父元件所传递的 props 包含 Object, 则在元件因状态改变而 ...
今天来探讨裸机Hyperviser在近几年朝大众化的原因 摆脱固有平台 受够了各大云端运算服务的绑手...
昨天介绍完使用相机拍照,今天会分享如何从相簿选取照片 成品: 拉一个 Button 、 ImageV...