当前位置: 首页 > Web前端 > JavaScript

JavaScript阻塞和非阻塞

时间:2023-03-27 00:01:28 JavaScript

JavaScript代码在单线程上运行,这意味着一次只能执行一个操作。这样做的好处是不需要考虑并发问题,只需要注意写的代码不要阻塞线程即可。通常,大多数浏览器在打开一个标签页时都会开启一个EventLoop,每个网页都是相互隔离的,这样可以避免一个线程被阻塞时整个浏览器卡死。如果你对前面提到的异步和同步还有印象,那么我们可以这样想:阻塞方法是同步执行的(synchronously),非阻塞方法是异步执行的(asynchronously)。以Node.js的文件操作为例://1.同步读取文件constfs=require('fs');constdata=fs.readFileSync('/file.md');//程序会一直阻塞直到文件读取完成console.log(data);moreWork();//在上面的console.log执行完之前不要做其他工作//2.使用异步形式读取集合constfs=require('fs');fs.readFile('/file.md',(err,data)=>{if(err)throwerr;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/gu...文章首发于IICOOM-个人博客|技术博客《JavaScript阻塞与非阻塞》