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程序,其缺陷也是不 ...
随机推荐
- openresty开发系列14--lua基础语法3函数
openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...
- shell编程系列23--shell操作数据库实战之mysql命令参数详解
shell编程系列23--shell操作数据库实战之mysql命令参数详解 mysql命令参数详解 -u 用户名 -p 用户密码 -h 服务器ip地址 -D 连接的数据库 -N 不输出列信息 -B 使 ...
- Fiddler抓包工具版面认识(一)
Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能 ...
- 了解有后门的sshd服务是如何劫持密码的
在服务器上安装一个打了后门补丁的sshd服务,当用户连接时,直接把密码记录下来,然后使用脚本发送到邮箱中. (1).实验环境 使用CentOS6.2作为系统环境,查看sshd和gcc的版本 [root ...
- C# log4net 配置及使用详解--日志保存到文件和Access(转)
按语: 最近项目要求选用Access数据库,但日志管理采用log4net,但保存到数据库一直没有成功,后按照如下配置在程序退出时可以成功保存. 开始新建文件应用log4net.dll ,重新编译就报 ...
- c# vs2010 连接access数据库(转)
第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...
- [转]Xmind 8 pro 软件破解版
链接地址:https://blog.csdn.net/qq_16093323/article/details/80967867 作者博客:http://www.carrotchou.blog/
- hdu 2018 母牛的故事 动态规划入门题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 设 f[i][j] 表示第i天年龄为j的母牛个数,其中j=4代表所有年龄达到4岁的成年母牛,则: ...
- 【JQuery插件】团购倒计时
案例截图 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3. ...
- FreeRTOS 时间片,外部中断,任务优先级的一个疑问
时间片1ms 假设有两个任务,A和B,A任务等待中断里面发出的信号量,B任务在运行 此时,B任务运行了300us的时候中断发生,发出信号量,那么任务A接收到信号量,A任务优先级高,A任务运行 有个问题 ...