进程,线程,Event Loop(事件循环),Web Worker
线程,是程序执行流的最小单位。线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行。线程有就绪,阻塞,运行三种基本状态。
阮一峰大神针对进程和线程的类比,很是形象:计算机的核心CPU,是个工厂,时刻运转着,工厂里有很多个车间(进程),一个车间开工其他车间不能开工,就是说:单核CPU一次只能运行一个进程。任何时候,CPU总是运行一个进程。
而一个车间里面有很多工人(线程),协同完成一个任务。所以:一个进程可以包括多个线程。车间空间是工人共享的,一个进程中的内存空间是所有线程共享的。
但是房间大小不同个,容纳量不同,有些线程进去了,其他线程就不能再进去使用了。这就是:一个线程使用某些共享内存时,其他线程得等它结束后才能使用共享内存。
内存可以上锁,防止其他线程进来,【互斥锁】也就是防止多个线程读写同一块内存区域。
还有些共享内存比较大,可以容纳多个线程,但是也是有限的,只能容纳固定数目的线程使用。如何保证多个线程不冲突呢?内存门口有个钥匙架,如果发现钥匙架空了,那就不能再进去了【信号量】。
事件循环(Event Loop):
JavaScript是单线程的,单线程意味着需要一个任务队列来管理任务事件,任务分为两种:同步任务和异步任务。同步任务是在主线程上面排队执行的任务,只有前面任务完成,下一个任务才能执行。异步任务是不进入主线程,而是进入任务队列中,只有通知主线程某个异步任务可以执行了,该任务方可执行。
同步任务在主线程执行形成一个执行栈,主线程之外有个任务队列(鼠标点击事件,键盘点击事件,网络请求),只要异步任务触发,在任务队列中放置一个事件,等执行栈中同步任务完成后,系统才会读取任务队列执行异步任务。主线程会重复去任务队列中读取任务并执行——事件循环。
任务队列是“先进先出”的数据结构,先来的优先被主线程读取。
主线程运行产生堆heap和栈stack,栈里面是各种同步方法,栈里面代码执行完毕主线程会读取任务队列,依次执行事件的回调函数。
所以,栈里面的同步任务总是在任务队列之前执行。
看个定时器的例子:
console.log(1);
setTimeout(function(){console.log(2);},0);
console.log(3);
定时器里面的第二个参数延迟时间设置为0或者比0小的数,输入都是1,3,2。因为console.log(1)和console.log(3)在主线程执行,而定时器是个异步任务放在了任务队列里面,只有栈中的同步事件清空后才能执行任务队列中的回调函数。
setTimeout(fn,0)意思是:fn在主线程最早可得的空闲事件执行,但是也得等主线程的同步任务和任务列表中排在它前面的事件都处理完才能执行它。
要注意的点是:setTimeout里面指定的延迟时间执行并不能保证就是那个时间执行,必须等到排在它之前的任务队列中的回调函数执行完毕后才能执行它。
————————————————————————————————————————————————
JavaScript是单线程,H5中的Web Worker作用就是给js创造多线程环境,允许主线程创建Worker线程,将一些任务分配给Worker运行,主线程运行同时,Worker线程在后台运行,互不干扰。等Worker线程完成计算任务,再把结果返回给主线程。主线程(通常负责UI交互)就不用被异步队列所打扰,运行就比较流畅。
使用Web Worker要注意的点:
1,同源限制:分配给Worker线程执行的脚本必须与主线程脚本同源。
2,DOM限制:Worker无法读取ODM对象。
3,通信限制:Worker与主线程不在一个上下文环境,不能直接通信。
4,脚本限制:不能执行alert,confirm但是可以使用XHR发送Ajax请求。
5,文件限制:无法读取本地文件,加载的脚本必须来源于网络。
Worker线程使用完毕后,为了节省资源必须关闭Worker。
Web Worker有自己的全局对象,不是主线程的window对象,例如:self.name,self.onmessage等。
Worker的应用场景:轮询。
这样看来Web Worker其实就是主线程的一个子线程,帮忙处理一些任务队列里面的事件,分担主线程的任务压力。
【完】
只有不悲不喜的人,能当得起大喜大悲。也只有无所谓得失,不等待回音的人,能攀上人生的高峰。
进程,线程,Event Loop(事件循环),Web Worker的更多相关文章
- javascript的event loop事件循环
javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.lo ...
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...
- Event Loop事件循环,GET!
JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...
- 浅谈 Event loop (事件循环)
从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...
- js event loop事件循环
浏览器环境 以下两段代码是等价的.req对事件的回调设置,实际上就是当前主线程任务队列的任务. var req = new XMLHttpRequest(); req.open('GET', url) ...
- JavaScript event loop事件循环 macrotask与microtask
macrotask 姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. mic ...
- Evevt Loop 事件循环
目录 JavaScript 是一门单线程的语言 一.什么是event Loop的执行机制 练习 异步任务-setTimeout 练习1: 练习2: 练习3: 练习4: 二 事件队列作用 同步任务 例1 ...
- JavaScript Concurrency model and Event Loop 并发模型和事件循环机制
原文地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop JavaScript 有一个基于 event loop 的 ...
随机推荐
- SecureCRT8.1安装破解
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 一.安装破解 [基本信息] SecureCRT v8.x 注册机,TEAM Z.W.T 出品,MD5 = 44114b9 ...
- Point Estimate|unbiased estimator|Confidence-Interval Estimate
8.1 Estimating a Population Mean Point Estimate estimate a single number, or point. 因为:the mean of ...
- mongodb use where and custom function to query mongodb存储过程
function name regexObjSubObjKey function code function(proto,value) { var match=false; var reg = new ...
- 基于Docker 部署Jmeter + Grafana + InfluxDB 性能测试监控配置(亲测可用)
工具介绍: InfluxDB:是一款用Go语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, lo ...
- 与项目欧拉速度比较:C vs Python与Erlang vs Haskell
我从问题#12 ProjectEuler作为编程练习,并比较我在C,Python,Erlang和Haskell中的实现(当然不是最优)实现.为了获得更高的执行时间,我搜索了第一个有1000个以上因子的 ...
- RxSwift学习笔记之Subject
本文为原创文章,转载请标明出处 AsyncSubject 一个AsyncSubject只在原始Observable完成后,发射来自原始Observable的最后一个值.它会把这最后一个值发射给任何后续 ...
- SHELL的判断括号区别
在使用if语句时,经常会使用().(()).[].[[]].{}等括号,如下为几种括号简单区别对比: ( ) 用于多个命令组.命令替换.初始化数组: (( )) 整数扩展.运算符.重定义变量值,算术运 ...
- 吴裕雄--python学习笔记:sqlite3 模块
1 sqlite3.connect(database [,timeout ,other optional arguments]) 该 API 打开一个到 SQLite 数据库文件 database 的 ...
- CSS--沃顿商学院网页布局
源代码: <head> 右键CSS样式--附加样式表 </head> <body> <div id="dd"> <div id ...
- js 中 == 和 === 的区别
js中的 ==和===的区别 简单理解 js 是弱类型的语言,其中 == 可以理解为 是值是否相等,而===不仅比较值是否相等,还比较类型是否相等. 简单案例: var str = "1&q ...