美文网首页
浏览器 HTTP js 2020-02-05(未经允许,禁止转载

浏览器 HTTP js 2020-02-05(未经允许,禁止转载

作者: 9_SooHyun | 来源:发表于2020-02-05 16:07 被阅读0次

1.多进程浏览器

chrome是多进程浏览器
chrome浏览器中,【每打开一个tab,就新起了一个进程

如图所示:
chrome起了5个页面,在任务管理器中,共有1个主进程+5个页面进程
结束任何一个页面进程,对应的页面就会宕掉


chrome浏览器多进程

同样的方法还可以验证edge浏览器也是多进程浏览器

多进程浏览器的优劣:

  • 优势:避免一个页面崩溃而影响其他的页面应用(由于多进程,每个页面都有自己独立的GUI渲染引擎和Javascript渲染引擎,在Javascript引擎运行脚本时,GUI渲染线程处于挂起状态)
  • 劣势:多进程的资源占用相对更多一些

2.单线程的JavaScript

JavaScript设计为单线程是使命使然,它就是【设计用来实现用户互动+渲染DOM

为了避免多个JavaScript线程同时对一个页面元素做修改而产生冲突的情况,我们有两种选择:上锁的多线程或者直接单线程。如果选择多线程,有人调侃说:【一个程序员碰到了一个问题,他决定用多线程来解决。现在两个他问题了有…】显然最后一句是在调侃多线程下并不知道哪个线程先启动,同时线程同步又涉及到锁的设计。为了避免引入锁带来更大的复杂性,Javascript选择了单线程执行

因此,浏览器任何时候都有且只有一个JavaScript线程在运行,并且是【按顺序】执行

如何理解异步JavaScript:

JavaScript本身不可以异步,在单线程JavaScript的机制下,本质上任务只能一个接一个执行。这时,如果某段js代码需要长时间的运行,其他后面的js程序就要耗时等待,造成页面长时间无响应的假死现象。这非常破坏良好的交互性

举个例子,我们去麦当劳点餐,这个麦当劳只有一个员工,模拟单线程的JavaScript。如果需要等待前面的顾客彻底配餐完毕后面的顾客才能开始点餐,就会浪费大量的时间,也会造成“队伍怎么不动啊”“麦当劳效率好低啊”等等一系列的吐槽,产生“麦当劳工作低效”的现象,类似于浏览器的假死

那么,这个员工需要怎么做呢?

配餐是耗时的,而点餐是不耗时的。原则就是,不能让耗时的操作阻塞后面的不耗时操作,也就是不能让配餐阻塞点餐。因此,员工应该先给大家点好餐,将大家的订单按顺序记录下来,保证用户的交互(类似于避免浏览器的假死),然后再按照大家点餐的顺序,慢慢配餐,配好之后再通知取餐(类似回调)

我们看到,这里借助了一个【订单记录】将耗时的操作暂时记录下来,这实际上就是队列的使用。类似地,异步JavaScript的本质就是:JavaScript线程将不耗时事件触发的程序按顺序执行,而将耗时事件(如Ajax)的消息不断地加入到一个【消息队列】中,当JavaScript线程继续向下执行完毕后,再回头处理这个队列的事件响应

如图


js的异步机制

可参考:
https://zhuanlan.zhihu.com/p/26567159

相关文章

网友评论

      本文标题:浏览器 HTTP js 2020-02-05(未经允许,禁止转载

      本文链接:https://www.haomeiwen.com/subject/cuzjxhtx.html