摘要:事件循环当进程启动时,会创建一个循环,每个循环通过内部的观察者来查看是否有事件需要处理,如果有就取出事件和它相关的回调函数去执行,执行完以后就进入下一个循环,如果不再有就退出进程。
前言
在学习eventloop之前,我们需要复习一下js的单线程和异步。事件循环
虽说js是单线程的,但是在浏览器和Node中都做了相应的处理。如浏览器中的web workers(工作线程),Node中的child_process(子进程)。它们的出现对大量计算的分解起到了促进作用。
当进程启动时,Node会创建一个tick循环,每个tick循环通过内部的观察者来查看是否有事件需要处理,如果有就取出事件和它相关的回调函数去执行,执行完以后就进入下一个循环,如果不再有就退出进程。
浏览器中的eventloop在浏览器中把异步事件放到工作线程中,避免阻塞主线程UI的渲染
console.log("进程开始") const ajax = new XMLHttpRequest() ajax.addEventListener("load", () => { console.log("load") }) ajax.addEventListener("loadend", () => { if (ajax.readyState == 4 && ajax.status == 200) { console.log("ajax success") } else { console.log("ajax success") } }) 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") }) let i = 0 while(i < 10000) { i++ } console.log(i) console.log("进程结束")
从结果可以看出三种异步处理不阻塞主线程代码的执行,而ajax、fetch、setTimeout根据代码处理结束的先后来执行回调函数。Nodejs中的eventloop
Node中的事件循环根据观察者的优先级来执行,同一个循环内的process.nextTick -> setTimeout -> setImmediate
setTimeout(() => { console.log("setTimeout") }, 0) setImmediate(() => { console.log("setImmediate1") process.nextTick(() => { console.log("setImmediate1 插入nextTick") }) }) setImmediate(() => { console.log("setImmediate2") }) process.nextTick(() => { setTimeout(() => { console.log("nextTick1 setTimeout") }, 100) console.log("nextTick1") }) process.nextTick(() => { console.log("nextTick2") }) console.log("正常执行")总结
事件循环的执行特点,源于利用单线程,远离多线程死锁、状态同步等问题;利用异步让单线程远离阻塞,以更好的使用CPU。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/113753.html
前言 在学习eventloop之前,我们需要复习一下js的单线程和异步。虽说js是单线程的,但是在浏览器和Node中都做了相应的处理。如浏览器中的web workers(工作线程),Node中的child_process(子进程)。它们的出现对大量计算的分解...
前言 在学习eventloop之前,我们需要复习一下js的单线程和异步。虽说js是单线程的,但是在浏览器和Node中都做了相应的处理。如浏览器中的web workers(工作线程),Node中的child_process(子进程)。它们的出现对大量计算的分解...
...重点与学习心得总结如下,本文主要总结ChannelHandler 及 EventLoop 的知识点和基本用法,本文章节排序参照《Netty in Action》的章节排序。 以下内容主要参考「并发编程网」的 《Netty in Action》中文版 以及《Netty in Action》原版图书,...
...然有异步,那顺序是怎样的?这些执行顺序规则就是理解eventLoop的要点,继续往下。 上图为我录制的chrome控制代码台执行顺序,虽然能看出执行顺序但我们还是懵逼的,我们不知道规则,不懂就要问。 搜索了很多官方、个人博...
...起来。 单线程Reactor实现 muduo的Reactor核心主要由Channel、EventLoop、Poller、TimerQueue这几个类完成。乍一看还有一点绕,代码里面各种回掉函数看起来有点不直观。另外,这几个类的生命周期也值得注意,容易理不清楚。 1. Channel Chan...
阅读 2371·2021-09-09 09:33
阅读 3225·2021-07-29 14:49
阅读 2223·2019-08-30 15:53
阅读 3098·2019-08-29 16:27
阅读 1738·2019-08-29 16:11
阅读 687·2019-08-29 14:17
阅读 2082·2019-08-29 13:47
阅读 1771·2019-08-29 13:28