js 单线程 异步
线程与进程:
进程是系统资源分配和调度的单元。一个运行着的程序就对应一个进程。在windows中,每一个打开的运行的应用程序或后台程序,比如运行中的qq,谷歌浏览器,网易云音乐,资源管理器等都是一个进程。一个进程包括了运行中的程序和程序所使用到的内存和系统资源。比如,边听音乐,边在博客园写博客,这 就是开了两个进程。
线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程。比如网易云一遍播放音乐,一遍显示歌词,网易云是进程,播放音乐和展示歌词是网易云进程下的两个线程。
同步和异步:
同步异步是指程序的行为。同步时程序发出调用的时候,一直等待直到返回结果。没有结果之前不会返回。也就是说,同步是调用者主动等待调用的过程。
异步是发出调用之后,马上返回,但是不会马上返回结果。调用者不必主动等待,当被调用者得到结果之后会主动通知调用者。
上面的概念可能比较官方,不易理解。通俗来说,就是,你去卖煎饼,然后再那等老板做好之后递给你,你才能走的过程 就是同步。你去肯德基点餐,然后点完之后,找个位置坐着玩手机,等做好后之后,前台的小哥哥小姐姐的叫号通知你去拿的过程就是异步。同步就是 只能一件件的事情去做,做完一件,再做一件。而异步不是,异步是你再做一件事的等待过程中,可以去做其他的事情。这就是同步和异步的区分。
console.log()
console.log('同步')
console.log()
//1
//同步
//
console.log()
setTimeout(() => {console.log('异步‘)}, 0)
console.log()
//1
//2
//异步
浏览器是单线程还是多线程?---多线程
一个浏览器通常有以下几个常驻的线程:
- 渲染引擎线程:顾名思义,该线程负责页面的渲染。
- JS引擎: 负责JS的解析和执行
- 定时触发器线程: 处理定时事件,比如setTimeout,setInterval
- 事件触发线程:处理DOM事件
- 异步http请求线程:处理http请求
浏览器只分配给Js一个主线程,用来执行任务,但是一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但是,前端的某些任务是很消耗时间的,如果,让他们和别的任务一样,都老老实实的排队等待执行,执行效率就会非常的低,甚至导致页面的假死。所以,浏览器为了这些耗时任务,就开辟了另外的线程,如: http请求,浏览器定时触发器等,这些任务 都是异步的,
那js 的单线程和异步 是不是有点自相矛盾呢?单线程和异步确实不能同时为一个语言的特性,js 选择了成为单线程语言,所以它本身不可能是异步的,但Js的宿主浏览器,Node等是多线程的,宿主环境通过某种方式使得Js具备了异步的属性。
任务队列
js任务分为同步任务和异步任务,同步任务指的是,在主线程上排队执行的任务,只有钱一个任务执行完毕,才能执行后一个任务。异步任务:不进入主线程,而进入“任务对列”的任务,只有“任务队列”通知主线程,某个异步任务可以执行了。该任务才会进入主线程执行。
异步执行的运行机制:
- 所有的同步任务都在主线程上,形成一个【执行栈】
- 主线程之外,还存在一个“任务队列”。只要异步任务有了运行结果,就在“任务队列”之中放置一个事件。
- 一旦“执行栈”种的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
- 主线程不断重复上面的第三步。
回调函数
当主线程开始执行异步任务,就是执行对应的回调函数。
异步任务必须指定回调函数。
js中的异步之定时器
setTimeout(function(){
console.log();
},)
console.log();
//1
//0
当有耗时任务的时候,会把它放在任务队列中等待主线程空闲然后再执行。实际再执行的过程中,浏览器会默认setTimeout以及ajax请求这一类的方法都是耗时程序(尽管可能不耗时)。所以此时的setTimeout尽管它推迟时间为0,但是js不会立即执行,而是把它加入任务队列,当执行完执行栈的同步任务也就是打印1后,再执行setTimeout的回调函数,打印0。
setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行。划重点::: 尽早可能。也就是说setTimeout 将当前的回调函数加入到任务队列中,当前任务耗时过长,需要等很久,灭有办法保证,回调函数会在指定的时间内执行。
js 单线程 异步的更多相关文章
- js的异步和单线程
最近,同事之间做技术分享的时候提到了一个问题"js的异步是另开一个线程吗?"当时为此争论不休.会后自己查阅了一些资料,对这个问题进行一个自我的分析与总结,有不同意见的希望可以赐教, ...
- 探秘JS的异步单线程
对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异.而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的. 我曾尝试用“ ...
- 【本周面试题】第2周 - js单线程和异步相关问题
硬性知识点考察: 为什么js是单线程的? 因为js设计最初是为了操作dom而生,如果是多线程的,当多个线程同时修改一个dom时就会产生冲突,所以设计成单线程,一次只能做一件事. 既然是单线程为什么要有 ...
- JS定时器和单线程异步特性
首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码.具体函数: setTimeout(callback, delay);/ ...
- 【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制
转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93% ...
- JS的异步世界
前言 JS的异步由来已久,各种异步概念也早早堆在开发者面前.可现实代码中,仍然充斥了各种因异步顺序处理不当的bug,或因不好好思考,或因不了解真相.今天,就特来再次好好探索一番JS的异步世界. 01 ...
- JS 单线程
js单线程阻塞实例setTimeout(function () { while (true) { } }, 1000);setTimeout(function () { alert('end 2'); ...
- JS的异步模式
JS的异步模式:1.回调函数:2.事件监听:3.观察者模式:4.promise对象 JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous) ...
- 单线程异步回调机制的缺陷与node的解决方案
一.node单线程异步的缺陷: 单线程异步的优点自然不必多说,node之所以能够如此快的兴起,其单线程异步回调机制相比于传统同步执行编程语言的优势便是原因之一.然而,开发一个node程序,其缺陷也是不 ...
随机推荐
- Dart中排除空的情况:
但是dart的string类型还有另一个方法isNotEmpty,此时这样写: if (str?.isNotEmpty()) { // str is not empty, do something } ...
- Qt编写自定义控件61-通用移动
一.前言 通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐 ...
- Python3 IO编程之文件读写
读写文件是最常见的IO操作.python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一个,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序终结操作磁盘, ...
- .Net Core 2.2 项目部署到IIS
1.安装IIS所需的Host扩展 从官网(https://dotnet.microsoft.com/download/dotnet-core/2.2)下载对应的.net core版本的Runtime ...
- Linux18.04换源等等等配置
root用户 sudo passwd root 安装Tools 文件→其他位置→Vmware Tools→打开终端. 管理员权限→copy→tar -zxvf 文件名解压→打开vmware-tools ...
- mysql存储过程demo
#删除存储过程 -- drop procedure if exists add_test; CREATE PROCEDURE add_test() begin #定义变量 declare client ...
- 【VS开发】windows下的signal
在windows下,信号机制简单来说是通过工作线程实现的,该线程运行于相对优先级THREAD_PRIORITY_HIGHEST,当信号产生时,windows生成该线程执行信号处理逻辑,由于该线程优先级 ...
- MySQL的索引有哪些
一.索引是什么 索引,在MySQL中也叫“键(key)”,是存储引擎用于快速找到记录的一种数据结构.如果把数据库的一张表比作一本书,那索引则是这本书的目录,通过目录,我们能快速找到我们想要的主题所对应 ...
- ubuntu gcc 安装 使用
"人多不足以依赖,要生存只有靠自己." -- 拿破仑 gcc是什么:-------------------------- Linux系统下的Gcc(GNU C Compiler)是 ...
- MySQL(八)事务的隔离级别
一.事务的并发问题 1.脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 2.不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并 ...