issues
search
Mardanjan
/
Blog
学习笔记(在issues里),一些小demo的源码在这里,demo在线地址会持续更新
1
stars
0
forks
source link
JavaScript:事件循环和任务队列
#26
Open
Mardanjan
opened
4 years ago
Mardanjan
commented
4 years ago
Node是什么
node.js是一个基于chrome V8 引擎的JavaScript运行环境,Node不是一门语言,是让JavaScript运行的再后端的一个环境,运行时JavaScript不包括全集,因为服务端中不存在DOM和BOM队形,但是node也提供了一些新的模块,比如http,fs等等。
Node解决了什么?
Node的首要目的是提供一个简单的,用于创建高性能服务器的开发工具。
Web服务器的瓶颈在与并发的用户量
Node在处理高并发,I/O密集场景有明显的性能优势
高并发是指在同一时间内访问服务器
I/O密集是文件操作,网络操作,数据库操作,等等
进程与线程
进程是操作系统分配资源和调度任务的基本单位
线程是建立在进程上的一次程序运行单位,一个进程包含多个线程
浏览器线程
用户界面-包括地址栏,前进后退按钮,书签菜单等
浏览器引擎-在用户界面和呈现引擎之间传送指令(浏览器的主进程)
渲染引擎,也被成为浏览器内核
一个插件对应一个进程
GPU提高网页浏览的体验
浏览器渲染引擎
渲染引擎内部是多线程的,内部包含ui线程和js线程
js线程和ui线程是互斥的,目的是为了保证不产生冲突
js单线程
js是单线程的,因为如果同时多个线程操作dom,页面就会混乱,这里所谓的单线程指的就是主线程,Node中的主线程依旧是单线程的
webworker多线程
它和js主线程不是同级的,主线程可以控制webworker,但是webworker不能操作dom,不能获取document,window
其它线程
浏览器事件触发线程,用来控制时间循环,settimeout,浏览器事件,ajax回调
定时器触发线程
异步http请求线程
浏览器中的eventLoop
同步任务都在主线程上执行,形成一个执行栈
主线程之外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件
一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,任务队列中的事件放到执行栈中依次执行
主线程从任务队列不断读取事件,这个过程是循环不断的
整个这种运行的机制成为Event Loop
宏任务和微任务
宏任务: settimeout,setinterval,setimmetiate,i/o
微任务 process.nexTick, promise.then等等,还有一些不怎么用的,我就不写了
同步代码先执行,执行是在执行栈中执行的,微任务大于宏任务,会优先执行,微任务process.nextTick的优先级比then要高
Node是什么
Node解决了什么?
Node在处理高并发,I/O密集场景有明显的性能优势
进程与线程
浏览器线程
浏览器渲染引擎
js单线程
webworker多线程
其它线程
浏览器中的eventLoop
宏任务和微任务