这篇博客将先容Node.js的壅闭(Blocking)与非壅闭(Non-Blocking)。我会提到Event Loop与libuv,然则不领会它们也不会影响阅读。读者只需要有一定的JavaScript基础,明白Node.js的回调函数(callback pattern)就可以了。
博客中提到了许多次I/O,它主要指的是使用libuv与系统的磁盘与 *** 举行交互。
壅闭指的是一部分Node.js代码需要等到一些非Node.js代码执行完成之后才气继续执行。这是由于当壅闭发生时,Event Loop无法继续执行。
对于Node.js来说,由于CPU麋集的操作导致代码性能很差时,不能称为壅闭。当需要守候非Node.js代码执行时,才气称为壅闭。Node.js中依赖于libuv的同步方式(以Sync末端)导致壅闭,是最常见的情形。固然,一些不依赖于libuv的原生Node.js方式有些也能导致壅闭。
Node.js中所有与I/O相关的方式都提供了异步版本,它们是非壅闭的,可以指定回调函数,例如fs.readFile。其中一些方式也有对应的壅闭版本,它们的函数名以Sync末端,例如fs.readFileSync。
壅闭的方式是同步执行的,而非壅闭的方式是异步执行。
以读文件为例,下面是同步执行的代码:
const fs = require('fs'); const data = fs.readFileSync('/file.md'); // 文件读取完成之前,代码会壅闭,不会执行后面的代码 console.log("Hello, Fundebug!"); // 文件读取完成之后才会打印
对应的异步代码如下:
const fs = require('fs'); fs.readFile('/file.md', (err, data) => { if (err) throw err; }); // 代码不会由于读文件壅闭,会继续执行后面的代码 console.log("Hello, Fundebug!"); // 文件读完之前就会打印
之一个示例代码看起来要简朴许多,然则它的瑕玷是会壅闭代码执行,后面的代码需要等到整个文件读取完成之后才气继续执行。
在同步代码中,若是读取文件出错了,则错误需要使用try...catch处置,否则历程会溃逃。对于异步代码,是否处置回调函数的错误则取决于开发者。
我们可以将示例代码稍微修改一下,下面是同步代码:
const fs = require('fs'); const data = fs.readFileSync('/file.md'); console.log(data); moreWork(); // console.log之后再执行
异步代码如下:
const fs = require('fs'); fs.readFile('/file.md', (err, data) => { if (err) throw err; console.log(data); }); moreWork(); // 先于console.log执行
在之一个示例中,console.log将会先于moreWork()执行。在第二个示例中,由于fs.readFile()是非壅闭的,代码可以继续执行,因此moreWork()会先于console.log执行。 moreWork()不用守候读取整个文件,可以继续执行,这是Node.js可以增添吞吐量的要害。
Node.js中 *** 代码执行是单线程的,因此并发指的是Event Loop可以在执行其他代码之后再去执行回调函数。若是希望代码可以并发执行,则所有非JavaScript代码好比I/O执行时,必须保证Event Loop继续运行。
举个例子,假设Web服务器的每个请求需要50ms完成,其中45ms是数据库的I/O操作。若是使用非壅闭的异步方式执行数据库I/O的话,则可以节约45ms来处置其他请求,这可以极大地提高系统的吞吐量。
Event Loop这种方式与其他许多语言都不一样,通常它们会建立新的线程来处置并发。
当我们处置I/O时,应该制止以下代码:
const fs = require('fs'); fs.readFile('/file.md', (err, data) => { if (err) throw err; console.log(data); }); fs.unlinkSync('/file.md');
上面的示例中,fs.unlinkSync()很可能在fs.readFile()之前执行,也就是说,我们在读取file.md之前,这个文件就已经被删掉了。
为了制止这种情形,我们应该是要非壅闭方式,来保证它们根据准确的顺序执行。
const fs = require('fs'); fs.readFile('/file.md', (readFileErr, data) => { if (readFileErr) throw readFileErr; console.log(data); fs.unlink('/file.md', (unlinkErr) => { if (unlinkErr) throw unlinkErr; }); });
上面的示例中,我们把非壅闭的fs.unlink()放在fs.readFile()的回调函数中。
Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。
原文: Overview of Blocking vs Non-Blocking1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
微信能关联看聊天记录(怎么知道别人微信聊天记录吗)微信是我们最最常用的手机APP和电脑应用了,而且用户量还在蹭蹭的上涨。 关于微信的优缺点,很多小伙伴都比较了解。 优点就是相对于QQ没有那...
老北京烤鸭(老北京烤鸭加盟 费用多少) 重点: “老北京烤鸭讲究武吃”,说着就把甜面酱洒在了整只烤鸭上,抱起鸭子直接啃了一口,之后还拿起荷叶饼擦起了嘴。 与这名吃播博主类似,凭借老北京吃播小视频...
对财务人员来说,区分和计算各种利润(或利润率)并不是很难,但想要理解他们所带给企业的各种信息,却着实要花上一些工夫。 1、 毛利润 毛利润=营业收入-营业成本 由于不同行业的营业成本存...
给你提供几个方法:1保证信誉度,没菜了,把门放进仓库,客人进不来,信誉度就不会下降啦!2多做菜宫保鸡丁、番茄炒蛋。 给你一张图片吧,这也是我在网上找到的,我也在使用这个布局,不错哦~ 你看看我的餐厅布...
怎么成为黑客高手(怎么才能成为黑客高手)(tiechemo.com)一直致力于黑客(HACK)技术、黑客QQ群、信息安全、web安全、渗透运维、黑客工具、找黑客、黑客联系方式、24小时在线网络黑客、黑...
KRYOLAN遮瑕膏是一款非常好用但是也昂贵的遮瑕,相信会化妆的人一定非常的需要这样一款遮瑕膏,不过这样好用的遮瑕膏也已经有假货了,那么怎么知道自己买到的KRYOLAN遮瑕膏真假是真的还是假的呢,友谊...