DAY6: Node 的内部机制(二)

上一篇DAY5: Node 的内部机制(一)主要解释了JavaScript的同步与非同步,相信看完上一篇完再来看今天这篇就会相当好理解了,故建议看这篇之前先浏览前一篇。
但前一篇开头也有提到Node中阻塞与非阻塞,这是针对I/O 的调用。并非可以跟同步与非同步画上等号,主要是针对的状态不同,就Node的阻塞与非阻塞I/O 都是同步的,这部分还请多加理解!!
正式进入主题吧!

何谓阻塞?

对於I/O分成数据的准备 与返回的结果,I/O会发出系统回调请求後,就一直处在等待的状态,等到数据准备与返回结果完成後,再重新运行。

举个例子:

function dataone(){
    var start=new Date().getTime();
    while (new Date().getTime()<start+5000);
}
dataone();
console.log("dataone 已更新完毕");
console.log("I am Nicole!!");
console.log("Nicole is me~");

执行结果:

https://ithelp.ithome.com.tw/upload/images/20210918/2014024418Z1XH6T7E.jpg

实际处理这段程序码会发现,当执行dataone这个的函数的更新,而当dataone这个函数还没更新完时,下面三行log只能等待!而当函数执行完後,才会相继出现。
而这边的

dataone();

是属於直接被调用的情况下,与接下来非阻塞的例子有很大的不同之处。

(这边特别说明的是例子中的这段

while (new Date().getTime()<start+5000);

可以调整毫秒的时间,只是透过这段执行时可以显现出等待时间的长短。)

何谓非阻塞?

基本和阻塞过程类似,但不同於阻塞的是,如果数据还没准备完成或是还在处理中,不须等待,直接执行,当数据准备完成再回调出来。
举个例子:

function dataone(done)
{
    setTimeout(()=>
    {
        done();
    }
        ,5000);
    }
    dataone(function()
    {
        console.log("dataone 更新完毕!!")
    });
console.log("I am Nicole!!");
console.log("Nicole is me~");

执行结果:
https://ithelp.ithome.com.tw/upload/images/20210918/20140244t53ItbgXrW.jpg

再来:
https://ithelp.ithome.com.tw/upload/images/20210918/20140244nQisx4PDzY.jpg

这边结果会分成两段来呈现是因为在dataone处理过程中需要等待,而等待的过程已经先把下面两行的log呈现出来了,当dataone处理完成後就会显示dataone里面的内容!故分成两段图呈现是强调这等待的过程到结果的完整地呈现!

setTimeout()是指定毫秒数调用函数。(这边拿来设定我的dataone处理的时间,跟阻塞的例子一样可以自己调整等待的毫秒数)。
done 是代表回调函数。(告知将要传递的函数说参数函数已处理完毕)。
这边的

setTimeout(()=>
    {
        done();
    }
        ,5000);
    }

是作为参数传递给另一个函数

dataone(function()
    {
        console.log("dataone 更新完毕!!")
    });

作为触发点才会执行回调函数。与阻塞例子中的

dataone();

直接拿来被取用有很大的区别!!!


<<:  ZFS优化与修复

>>:  线性串列的循序储存 - DAY 4

[Day 1] 为啥选择Vue.js咧???

一开始会参加铁人赛的原因是因为某堂课的要求(。・∀・)ノ゙ 既然都参加了当然就不能放弃这次的机会,藉...

WordPress 安装 Google Analytics 教学,完整分析网站流量

在 WordPress 上架设的 Blog 已经完成了,也写了数篇的文章,在 Google 上已经可...

Day 05 Decorator

Decorator(装饰器) 是 Python 中很好用的一个东西,只要 @ 一下就可以处理掉很多东...

Day07 - Flowchart versus State Diagram 让我们比一比

我们根据昨天的需求画出以下两张图 1. Flowchart 我们先看看 Flowchart 图中的白...

Day 30:案例探讨2 - Use Cases (Uber/Github/Facebook)

Elasticsearch在Uber的Marketplace Dynamics核心数据系统中扮演着关...