当前位置: 首页 > 后端技术 > Node.js

事件循环(EventLoop)学习总结

时间:2023-04-03 13:34:03 Node.js

前言在学习eventloop之前,我们需要温习一下单线程和异步的js。js虽然是单线程的,但是在浏览器和Node中都会进行相应的处理。比如浏览器中的webworker(工作线程),Node中的child_process(子进程)。它们的出现促进了海量计算的分解。事件循环当进程启动时,Node会创建一个滴答循环。每个tick循环都会通过内部观察者检查是否有事件需要处理。如果有,则取出事件及其相关的回调函数执行。执行完后会进入下一个循环,如果没有就退出流程。浏览器中的eventloop将异步事件放在浏览器的工作线程中,避免阻塞主线程UI渲染console.log('processstarts')constajax=newXMLHttpRequest()ajax.addEventListener('load',()=>{console.log('load')})ajax.addEventListener('loadend',()=>{if(ajax.readyState==4&&ajax.status==200){console.log('ajax成功')    }else{console.log('ajax成功')    }})ajax.open('get','http://localhost/study/html/vue.js')ajax。send()setTimeout(()=>{console.log('setTimeout')},300)fetch('http://localhost/study/html/demo.json',{headers:{'content-type':'application/json'}}).then(res=>{console.log('fetch')})让i=0while(i<10000){i++}console.log(i)console.log('ProcessEnd')从结果可以看出,三种异步处理都没有阻塞主线程代码的执行,而ajax、fetch、setTimeout是按照代码处理结束的先后顺序执行回调函数.NodejseventloopNode中的事件循环是根据观察者的优先级执行的,process.nextTick->setTimeout->setImmediatesetTimeout(()=>{console.log('setTimeout')},0)setImmediate在同一个循环中(()=>{console.log('setImmediate1')process.nextTick(()=>{console.log('setImmediate1insertnextTick')})})setImmediate(()=>{console.log('setImmediate2')})process.nextTick(()=>{setTimeout(()=>{console.log('nextTick1setTimeout')},100)console.log('nextTick1')})process.nextTick(()=>{console.log('nextTick2')})console.log('normalexecution')总结了事件循环的执行特点,起源于单线程的使用,远离多线程死锁和状态同步等问题;使用异步让单线程避免阻塞以获得更好的CPU使用率。