JavaScript 的代码是运行在单线程上的,也就是说同一时刻只能有一个操作被执行。这样的好处是不用考虑并发问题,只需关注写得代码不要阻塞线程。

通常情况,大多数浏览器当你打开一个tab就会开启一个Event Loop,而且每个网页之间是隔绝的,可以避免出现阻塞线程时导致整个浏览器卡死。

如果你对之前提到的异步、同步还有印象,那么我们可以这样认为:阻塞的方法是以同步执行(synchronously),非阻塞方法以异步形式执行(asynchronously)。

以 Node.js 的文件操作为例:

// 1. 使用同步的方式读取文件
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 程序会一直阻塞知道文件读取完成
console.log(data);
moreWork(); // 直到上面的console.log执行完 才能做其他的工作// 2. 使用异步形式读取文集
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {if (err) throw err;console.log(data);
});
moreWork(); // 在console.log之前就可以做其他工作

Blocking/Non-Blocking

如果读取的文件很大,在读取完成之前,同步形式的代码将不能向下执行,这时就发生了阻塞。

Node.js使用回调来避免程序发生阻塞,使程序可以同一时间处理更多的工作。

我们思考这样一种情况:每个对 Web 服务器的请求需要 50 毫秒完成,而那 50 毫秒中的 45 毫秒是可以异步执行的数据库 I/O。选择 非阻塞 异步操作可以释放每个请求的 45 毫秒来处理其它请求。仅仅是选择使用 非阻塞 方法而不是 阻塞 方法,就能造成并发的显著差异。

事件循环不同于许多其他语言的模型,其它语言创建额外线程来处理并发工作。Node.js 提供了一系列的异步I/O方法来避免线程阻塞。

如何避免线程阻塞?

JavaScript中几乎所有的I/O操作都是非阻塞的(Non-Blocking),比如:网络请求,文件系统操作。这也是JavaScript非常依赖于回调函数(Callbacks)、Promises、Async/Await 的原因。

我们在编程时使用上面的方法就可以有效避免线程阻塞。

参考链接

https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

文章首发于 IICOOM-个人博客|技术博客 《JavaScript阻塞与非阻塞》

JavaScript阻塞与非阻塞相关推荐

  1. 创业笔记-Node.js入门之阻塞与非阻塞

    阻塞与非阻塞 正如此前所提到的,当在请求处理程序中包括非阻塞操作时就会出问题.但是,在说这之前,我们先来看看什么是阻塞操作. 我不想去解释"阻塞"和"非阻塞"的 ...

  2. 同步与异步,阻塞与非阻塞的区别

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清

    为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...

  4. 那些年让你迷惑的阻塞、非阻塞、异步、同步

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清 ...

  5. 这次,让我们捋清:同步、异步、阻塞、非阻塞

    继上一篇说透I/O模型后,我们来谈谈网络 I/O 经常会伴随的几个容易令人混淆的概念:同步.异步.阻塞.非阻塞的区别. 这篇写完之后铺垫就差不多了,之后就正式开始 Netty 深度剖析了,敬请期待,嘻 ...

  6. 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

    承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...

  7. 并发、并行、串行、同步、异步、阻塞、非阻塞

    并发.并行.串行.同步.异步.阻塞.非阻塞 实际上同步与异步是针对应用程序与内核的交互而言的. 同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是 ...

  8. 【NIO】阻塞与非阻塞

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

  9. 阻塞与非阻塞的IO网络读写

    看我之前的文章就知道,一般对于网络读的socket,都会加上O_NONBLOCK,非阻塞的选项. int setnonblocking(int fd) {int old_option = fcntl( ...

最新文章

  1. 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
  2. 个人博客 | 网站部署终极操作:一行命令搞定!
  3. php io流 读取wav,记php中的io流---帮助理解
  4. linux 版本号 加号,如何去除Linux Kernel版本号后面的加号?
  5. oracle联合运算,Oracle UNION运算符
  6. oracle仅部分记录建立索引的方法
  7. Extjs 之dataview布局
  8. Java面向对象的三大特征
  9. 关于Kotlin循环遍历需要注意索引越界的问题
  10. android 远程调试工具,Android 远程调试工具STF——开源项目
  11. 浅析游戏中的打击感如何实现
  12. 【我的架构师之路】- golang源码分析之channel的底层实现
  13. Hexo搭建个人博客(十五)| 酒香也怕巷子深,让百度收录你的站点
  14. C++剖析 cout<<“hello world“<<endl;
  15. 拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉
  16. l那是计算机房吗,机房设计常用计算公式
  17. 100家大公司java笔试题汇总
  18. D3D11的颜色处理
  19. vue v-for 中 img图片渲染不出来的解决方法
  20. 环形队列的原理以及实现

热门文章

  1. esp8266的TCP通信基础教程(结合手机APP)
  2. MessageBox提示框自动关闭
  3. SSL weak ciphers 漏洞修复过程
  4. IDEA 的 Othere Settings(Default settings)消失了?
  5. java与C/C++的比较
  6. windows10计算机里输入法,win10电脑上输入法不见了怎么办
  7. 漫步最优化五——可行域
  8. Gradle脚本小总结
  9. atan、atanf、atanl、atan2、atan2f、atan2l
  10. python之图片文本识别