setTimeout是否阻塞
0. 结论
从现象上来看,setTimeout是异步的,但原理并不是多线程,而是任务队列的轮询机制,且受主线程阻塞
1. 先看例子
先看以下两种情况的输出:
例一:
sleep(3000);
console.log("start!");
setTimeout(() => {console.log(222);
}, 3000)
setTimeout(() => {console.log(444);
}, 5000)
setTimeout(() => {console.log(666);
}, 1000)
结果如下
start! // 3s
666 // 4s
222 // 6s
444 // 3+5=8s
例二:
console.log(111)
setTimeout(() => {console.log(222);
}, 3000)
console.log(333)
setTimeout(() => {console.log(444);
}, 0)
console.log(555)
setTimeout(() => {console.log(666);
}, 1000)
结果如下
111 // 立即
333 // 立即
555 // 立即
444 // 0s
666 // 1s
222 // 3s
到这里可以说明一点,setTimeout没有阻塞主线程,而且只有执行到setTimeout函数时计时器才开始倒计时,这其实是由于浏览器采用了任务队列的机制
2. 任务队列
在JavaScript中 所有的任务可以分为两种 一种是同步任务(synchronous)另一种是异步任务(asynchronous)
同步任务指: 在主线程上排队执行的任务 只有前一个任务执行完毕后 才能执行下一个任务
异步任务指: 不进入主线程 而进入 任务队列(task queue)的任务 等主线程的任务全部执行完成后 主线程会通过event loop(事件循环) 去询问任务队列中是否有可以被执行的任务了 如果有可以被执行的任务 这个时候这个任务就会被放进 主线程执行
下面这张图就更详细的解释了主线程和任务队列的关系
至此 setTimeout并不是异步的 而是JavaScript在执行的时候 会将setTimeout放入任务队列 等待主线程的执行(不阻塞主线程)全部执行完成后 再通过event loop去询问任务队列中是否有可执行的代码 再继续放入主线程中执行 故产生了异步的假象。
setTimeout是否阻塞相关推荐
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则 ...
- ajax请求会阻塞dom,Jquery ajax 同步阻塞引起的UI线程阻塞问题_jquery
最近做一个项目,遇到了一个问题同步ajax引起的ui线程阻塞问题,下面把我的问题解决过程分享给大家. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为 ...
- pythontcp服务器如何关闭阻塞_python 网络编程(socketserver,阻塞,其他方法)
重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...
- python socket connect 阻塞_python 网络编程(socketserver,阻塞,其他方法)
重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...
- day34 异常处理、断言、socket之ftp协议
Python之路,Day20 = 异常处理.断言.socket之ftp协议 参考博客:http://www.cnblogs.com/metianzing/articles/7148191.html 1 ...
- python套接字编程_Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...
- python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...
- python的socket编程
1.摘要 socket 2.socket简介 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...
- Python基础-socket编程
一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...
最新文章
- android Json解析详解
- 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
- 第十六届全国大学智能汽车竞赛竞速比赛规则
- 改变ie浏览器的收藏夹位置
- PyCaret:又一个神仙ML库
- oracle中使用sys_connect_by_path进行表中行值连接
- Leet Code OJ 26. Remove Duplicates from Sorted Array [Difficulty: Easy]
- 基于chrome内核的.NET开发资源
- 小程序开发学习(5)---实现天气预报小程序
- linux操作系统之进程组及会话
- 无限轮播图片的实现原理
- c#统计字符串中数字字符的个数【C#】
- 韩国出现加密货币妈妈潮 女性对加密投资兴趣趋升
- 如何使用PowerShell创建简单SQL Server数据库登录对话框
- python静态方法的作用_@staticmethod和@classmethod如何作用于python中的...
- 职场风云 | 导师的光亮
- 投资银行业务法规汇编----仅供学习
- 9年研发经验,扫地盲僧带你看2022年前端未来发展趋势
- 燃料电池多点恒功率工作Cruise仿真模型
- Ae 入门系列之九:运动跟踪与稳定(中)
热门文章
- redis 6379端口 telnet登录不上
- 如何通过 EMR 构建弹性低成本离线海量日志大数据分析
- h5 input标签使用正则表达式限制输入
- mysql版本升级对数据的影响_MySQL数据库升级的一些坑
- VMProtect使用技巧汇集__最好的虚拟机保护软件之一
- 关于左侧菜单的开发和动态路由注册
- 透明效果 -- Shader入门精要学习(7)
- C# 仓库物料管理系统 连接数据库SQL 高级语言编程
- cs5与html5区别,PS CS5和 CS6 7有什么区别?
- JS逆向 | 七麦数据analysis分析