Nodejs 中的同步与异步、阻塞与非阻塞

在 Nodejs 的学习过程中,我们经常会听到同步异步,阻塞和非阻塞。那什么是同步和异步?什么是阻塞和非阻塞呢?

Nodejs是单线程的异步事件驱动的Js运行时,使用事件循环的方式,将操作交给系统内核处理,当操作完成后内核通知Nodejs讲合适的回调函数添加到轮询队列中等待回调执行。而阻塞,在官方教程中也有说明

阻塞 是指在 Node.js 程序中,其它 JavaScript 语句的执行,必须等待一个非 JavaScript 操作完成。这是因为当
阻塞 发生时,事件循环无法继续运行 JavaScript。

在 Node.js 中,JavaScript 由于执行 CPU 密集型操作,而不是等待一个非 JavaScript 操作(例如
I/O)而表现不佳,通常不被称为 阻塞。在 Node.js 标准库中使用 libuv 的同步方法是最常用的 阻塞 操作。原生模块中也有 阻塞
方法。

在 Node.js 标准库中的所有 I/O 方法都提供异步版本,非阻塞,并且接受回调函数。某些方法也有对应的 阻塞 版本,名字以 Sync
结尾。


阻塞对比非阻塞一览

很明显可以看出,所谓的非 JavaScript 操作既不是ES中规定的API操作。所以像for循环,数值计算,这种并不算是阻塞。而标准库中所有的Sync方法是非 JavaScript 操作操作,会阻塞主线程的JS代码运行。

在Nodejs中,我们常听到异步回调,到底什么是异步回调?在js中,回调是通过执行传入的方法,既等到操作执行完,会通过回调方法通知。既然有异步回调也会有同步回调。

function func1(num, callbacll = result => result) {
    callbacll(num ** 2);
}
console.log("start");
func1(2, res => {
    console.log(res);
});
console.log("end");
// start
// 4
// end

同步既执行顺序与代码编写顺序相符的。而异步则是执行顺序与代码编写顺序不符。但是同步回调可直接写成下面这样子,所以一般同步回调使用的场景几乎没有。

function func1(num) {
    return num ** 2;
}
console.log("start");
console.log(func1(2));
console.log("end");
// start
// 4
// end

那看看异步回调是怎么样的。

const fs = require("fs");
console.log("start");
fs.readFile("./1.js", (err, data) => {
    if (err) {
        throw err;
    }
    console.log("data");
});
console.log("end");
// start
// end
// data

其中readFile的第二个参数就是异步回调方法。虽然叫异步回调方法,但是也是在主线程执行的,毕竟事件轮询调用这个回调方法是用来通知主线程的。

非阻塞方法需要异步回调方法通知主线程,阻塞方法直接阻塞Js主线程。阻塞和非阻塞都为非 JavaScript 操作,JavaScript 操作不能成为阻塞和非阻塞。

因为非阻塞需要异步回调函数通知主线程,当一个操作流程需要一连串的IO和网络操作,并且这些IO和网络操作都需要严格按照一定执行时,就会出现回调地狱。为了解决这个问题,人们给异步回调披上Promise的外衣,实现了链式调用,把异步回调用then的方式执行,把多行代码压成一行。但是依然不如同步代码一样看起来直观,所以人们有给Promise装一个箱子,就是async和await。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FarmerLZJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值