JavaScript单线程运行机制与并发模型
一、为什么JavaScript是单线程?
JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事。具体地,一个window对应一个JavaScript线程。
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
二、JavaScript并发模型与事件循环
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。那么JavaScript是如何实现异步调用的呢?
JavaScript里这种并发的一种理论上的模型如下:
(1)所有同步任务依次被执行,在内存栈区域产生相应的栈帧(活动记录)。
(2)一个JavaScript运行时包含一个待处理的消息队列,每个消息都与一个函数相关联。当栈为空时,就从队列中取出一个消息并进行处理。这个处理过程包含了调用与这个消息相关联的函数(以及因而创建了一个初始堆栈帧)。当栈再次为空的时候,也就意味着消息处理结束。
这种处理方式通常使用如下的方式来实现:
while(queue.waitForMessage()){queue.processNextMessage();
}
如果当前没有任何消息,queue.waitForMessage会同步等待消息到来。
因此这个过程被称为事件循环。
每一个消息执行完成后,其他消息才会被执行。在浏览器里,当一个事件出现且一个事件监听程序被绑定时,消息会被随时添加,如果没有事件监听器,则事件丢失。调用setTimeout函数会在一个时间段过去后在队列中添加一个消息,这个时间段作为函数的第二个参数被传入。如果队列中没有其他消息,那么这个消息会被马上处理,但是如果有其他消息,则setTimeout消息必须等待其他消息处理完。因此第二个参数仅仅表示最少的时间而非确切的时间。
以Ajax为例,事件循环模型如下:
JavaScript单线程运行机制与并发模型相关推荐
- JavaScript的运行机制,简单大白话讲解.
今天本来想写一篇async,await的文,但是讲它就得讲Promise,但是讲Promise又得讲异步编程,讲异步编程又得讲JS的运行机制.冷静一下 还是先讲讲基础吧 (本文仅为个人见解,有错误请指 ...
- JavaScript的运行机制
目录 参考链接: 阮一峰运行机制详解 一.JavaScript是单线程语言: 二.JavaScript的事件循环机制: 同步任务(synchronous): 异步任务(asynchronous): 事 ...
- 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...
- js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...
前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...
- javascript运行机制
阮一峰的网络日志 » 首页 » 档案 搜索 上一篇:乔布斯的管理课 下一篇:编译器的工作过程 分类: JavaScript JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 ...
- 傻傻分不清的javascript运行机制
学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆.Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable ...
- JavaScript 运行机制详解:Event Loop
转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单 ...
- JavaScript 运行机制详解
一:为什么JavaScript是单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. 那么,为什么JavaScript不能有多个线程呢? 这样能提高效率! Java ...
- 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop
PS: 我先旁观下大师们的讨论,得多看书了~ 别人说的:"看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲 ...
最新文章
- 重要更新 | 谷歌发布 TensorFlow 1.4,迁移Keras,支持分布式训练
- 【js】typeof与instanceof
- web前端研发工程师编程能力成长之路
- 理解和配置 Linux 下的 OOM Killer
- java中的HashSet内部是如何工作的
- Vue于React特性对比(三)
- 1003 我要通过!(20)(20 分)
- rsync 服务快速部署手册
- PHP使用ajax的post方式下载excel文件简单示例
- Python中的@property Decorator:其用例,优点和语法
- Python使用字典get()方法TypeError: get() takes no keyword arguments
- 用JS实现自动提取身份证的出生日期
- 阿里云服务器用Docker配置运行nginx并访问
- python提取全部个股数据_Python 股票历史数据的获取
- 纯前端html导出pdf(jsPDF.js)-分页-不分页
- nx零件库插件_ug标准件库下载
- 从王自如和老罗的论战中我貌似懂得了点神马...
- 苹果历代iPod产品大全相册
- 电机控制(1)直流电机的控制
- Windows系统搭建GitServer--Bonobo Git Server
热门文章
- 程序员离职后12天,被前领导命令回去讲清代码?小伙直接说收费
- request.META里包含了哪些数据?
- windows安装npm教程
- ffmpeg调用directshow camera 并sdl渲染
- 获取本机IP和MAC地址
- redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...
- 我的docker随笔32:sftp服务部署
- 阿里云ECS修复ubuntu 16.04漏洞过程
- 嵌入式Linux入门12:编程规范
- 完成一个分析H264码流的工具