JavaScript阻塞与非阻塞
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阻塞与非阻塞相关推荐
- 创业笔记-Node.js入门之阻塞与非阻塞
阻塞与非阻塞 正如此前所提到的,当在请求处理程序中包括非阻塞操作时就会出问题.但是,在说这之前,我们先来看看什么是阻塞操作. 我不想去解释"阻塞"和"非阻塞"的 ...
- 同步与异步,阻塞与非阻塞的区别
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清
为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...
- 那些年让你迷惑的阻塞、非阻塞、异步、同步
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清 ...
- 这次,让我们捋清:同步、异步、阻塞、非阻塞
继上一篇说透I/O模型后,我们来谈谈网络 I/O 经常会伴随的几个容易令人混淆的概念:同步.异步.阻塞.非阻塞的区别. 这篇写完之后铺垫就差不多了,之后就正式开始 Netty 深度剖析了,敬请期待,嘻 ...
- 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...
- 并发、并行、串行、同步、异步、阻塞、非阻塞
并发.并行.串行.同步.异步.阻塞.非阻塞 实际上同步与异步是针对应用程序与内核的交互而言的. 同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是 ...
- 【NIO】阻塞与非阻塞
"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...
- 阻塞与非阻塞的IO网络读写
看我之前的文章就知道,一般对于网络读的socket,都会加上O_NONBLOCK,非阻塞的选项. int setnonblocking(int fd) {int old_option = fcntl( ...
最新文章
- 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
- 个人博客 | 网站部署终极操作:一行命令搞定!
- php io流 读取wav,记php中的io流---帮助理解
- linux 版本号 加号,如何去除Linux Kernel版本号后面的加号?
- oracle联合运算,Oracle UNION运算符
- oracle仅部分记录建立索引的方法
- Extjs 之dataview布局
- Java面向对象的三大特征
- 关于Kotlin循环遍历需要注意索引越界的问题
- android 远程调试工具,Android 远程调试工具STF——开源项目
- 浅析游戏中的打击感如何实现
- 【我的架构师之路】- golang源码分析之channel的底层实现
- Hexo搭建个人博客(十五)| 酒香也怕巷子深,让百度收录你的站点
- C++剖析 cout<<“hello world“<<endl;
- 拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉
- l那是计算机房吗,机房设计常用计算公式
- 100家大公司java笔试题汇总
- D3D11的颜色处理
- vue v-for 中 img图片渲染不出来的解决方法
- 环形队列的原理以及实现