温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

到底什么是阻塞Blocking

发布时间:2021-10-13 10:26:48 来源:亿速云 阅读:171 作者:柒染 栏目:开发技术

这篇文章将为大家详细讲解有关到底什么是阻塞Blocking,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

  Node.js的阻塞(Blocking)与非阻塞(Non-Blocking)。我会提到EventLoop与libuv,但是不了解它们也不会影响阅读。读者只需要有一定的JavaScript基础,理解Node.js的回调函数(callbackpattern)就可以了。提到了很多次I/O,它主要指的是使用libuv与系统的磁盘与网络进行交互。

  什么是阻塞(Blocking)

  阻塞指的是一部分Node.js代码需要等到一些非Node.js代码执行完成之后才能继续执行。这是因为当阻塞发生时,EventLoop无法继续执行。

  对于Node.js来说,由于CPU密集的操作导致代码性能很差时,不能称为阻塞。当需要等待非Node.js代码执行时,才能称为阻塞。Node.js中依赖于libuv的同步方法(以Sync结尾)导致阻塞,是最常见的情况。当然,一些不依赖于libuv的原生Node.js方法有些也能导致阻塞。

  Node.js中所有与I/O相关的方法都提供了异步版本,它们是非阻塞的,可以指定回调函数,例如fs.readFile。其中一些方法也有对应的阻塞版本,它们的函数名以Sync结尾,例如fs.readFileSync。

  Blocking代码示例

  阻塞的方法是同步执行的,而非阻塞的方法是异步执行。

  以读文件为例,下面是同步执行的代码:

  constfs=require('fs');

  constdata=fs.readFileSync('/file.md');//文件读取完成之前,代码会阻塞,不会执行后面的代码

  console.log("Hello,Fundebug!");//文件读取完成之后才会打印

  对应的异步代码如下:

  constfs=require('fs');

  fs.readFile('/file.md',(err,data)=>{

  if(err)throwerr;

  });//代码不会因为读文件阻塞,会继续执行后面的代码

  console.log("Hello,Fundebug!");//文件读完之前就会打印

  第一个示例代码看起来要简单很多,但是它的缺点是会阻塞代码执行,后面的代码需要等到整个文件读取完成之后才能继续执行。

  在同步代码中,如果读取文件出错了,则错误需要使用try...catch处理,否则进程会崩溃。对于异步代码,是否处理回调函数的错误则取决于开发者。

关于到底什么是阻塞Blocking就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI