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是否阻塞相关推荐

  1. jQuery同步Ajax带来的UI线程阻塞问题及解决办法

    俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则 ...

  2. ajax请求会阻塞dom,Jquery ajax 同步阻塞引起的UI线程阻塞问题_jquery

    最近做一个项目,遇到了一个问题同步ajax引起的ui线程阻塞问题,下面把我的问题解决过程分享给大家. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为 ...

  3. pythontcp服务器如何关闭阻塞_python 网络编程(socketserver,阻塞,其他方法)

    重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...

  4. python socket connect 阻塞_python 网络编程(socketserver,阻塞,其他方法)

    重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...

  5. day34 异常处理、断言、socket之ftp协议

    Python之路,Day20 = 异常处理.断言.socket之ftp协议 参考博客:http://www.cnblogs.com/metianzing/articles/7148191.html 1 ...

  6. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  7. python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...

  8. python的socket编程

    1.摘要 socket 2.socket简介 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...

  9. Python基础-socket编程

    一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...

最新文章

  1. android Json解析详解
  2. 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
  3. 第十六届全国大学智能汽车竞赛竞速比赛规则
  4. 改变ie浏览器的收藏夹位置
  5. PyCaret:又一个神仙ML库
  6. oracle中使用sys_connect_by_path进行表中行值连接
  7. Leet Code OJ 26. Remove Duplicates from Sorted Array [Difficulty: Easy]
  8. 基于chrome内核的.NET开发资源
  9. 小程序开发学习(5)---实现天气预报小程序
  10. linux操作系统之进程组及会话
  11. 无限轮播图片的实现原理
  12. c#统计字符串中数字字符的个数【C#】
  13. 韩国出现加密货币妈妈潮 女性对加密投资兴趣趋升
  14. 如何使用PowerShell创建简单SQL Server数据库登录对话框
  15. python静态方法的作用_@staticmethod和@classmethod如何作用于python中的...
  16. 职场风云 | 导师的光亮
  17. 投资银行业务法规汇编----仅供学习
  18. 9年研发经验,扫地盲僧带你看2022年前端未来发展趋势
  19. 燃料电池多点恒功率工作Cruise仿真模型
  20. Ae 入门系列之九:运动跟踪与稳定(中)

热门文章

  1. redis 6379端口 telnet登录不上
  2. 如何通过 EMR 构建弹性低成本离线海量日志大数据分析
  3. h5 input标签使用正则表达式限制输入
  4. mysql版本升级对数据的影响_MySQL数据库升级的一些坑
  5. VMProtect使用技巧汇集__最好的虚拟机保护软件之一
  6. 关于左侧菜单的开发和动态路由注册
  7. 透明效果 -- Shader入门精要学习(7)
  8. C# 仓库物料管理系统 连接数据库SQL 高级语言编程
  9. cs5与html5区别,PS CS5和 CS6 7有什么区别?
  10. JS逆向 | 七麦数据analysis分析