DAY11: Node基础总整理

前几篇的互相比较来比较去的,是不是都有点乱了思绪,今天来做个小复习,从DAY5: node 的内部机制(一)DAY10: setTimeout和setImmediate的比较做个简单总整理。

同步:

  • 进程和线程的调用方式。
  • 会一直等待调用返回後才会继续执行後续。
  • 简单的说,会依照输入的指令顺序做处理。

非同步:

  • 进程和线程的调用方式。
  • 与同步相反,当发起调用後,会继续执行下一个动作,当调用返回後,才会透过回调函数开启。

阻塞:

  • 针对I/O的调用方式。
  • I/O在进程发出调用请求後,就一直等待直到数据准备完成与结果,都取得後再继续执行。
  • 不会去一直检视内核状态

非阻塞:

  • 针对I/O的调用方式。
  • 与阻塞相反,若数据准备与结果都还没取得,会返回上一个结果让进程知道还未准备就绪。
  • 会不断地检视内核的状态。

Node事件循环:

总共有六个不同阶段,每个阶段都有自己的回调函数,处理着不同的事件,依序是:
1. timers:

  • 用来执行处理setTimeOut()setInterval()的回调。
  • 若在处理一个耗时的回调,定时的回调就只能等待回调结束才能被执行,等於被阻塞了。
  • timers阶段的执行会被poll阶段所控制。

2. I/O callbacks:

  • 执行处理系统错误的回调。

3. poll:

  • 不断来回检视是否有新的I/O事件发生
  • 若没有新的事件发生,这里可能产生阻塞的阶段。
  • 对於设置了定时(位於timers阶段或check阶段设置的setImmediate()):当定时时间到,就执行定时的回调方法与
    poll事件队列中对应的事件。
    若poll阶段为空了:
    若有设置setImmediate(),事件循环会跳出poll阶段,进入check阶段执行setImmediate()的回调方法。
    若没有设置setImmediate(),事件循环进入等待新事件产生。

4. idle,prepare:

  • 仅於node内部使用,不须理会。

5. Check:

  • 主干就是setImmediate()
  • 为了处理setImmediate() 的回调,而占据事件循环的一个阶段。

6. Close callbacks:

  • close在此发出事件。
  • 这轮事件循环结束。

Process.nextTick():

  • 并非事件循环的一部份。
  • 是一个异步的动作,此动作在事件循环当前阶段结书後才会执行。
  • 伫列nextTickQueue被限制了大小,在递回中会产生错误。
  • 若出现死循环,会产生阻塞。

setImmediate():

  • 在poll阶段触发,对应回调方法在check阶段执行。
  • 不会产生呼叫堆叠,故递回可以在此使用

setTimeout():

  • 由於无法得知在执行的情况下事件循环到哪一个阶段了,故与setImmediate()一同出现的话,
    它们发生的顺序每一次 都不一定相同
  • 若是放在I/O的回调中,则一直会是setImmediate()先被执行。

三者优先顺序:
process.nextTick > setTimeout > setImmediate

实际例子:

//大乱斗
process.nextTick(()=>
{
  console.log("nextTick!! I'm NO.1 ");
},);

require('fs').readFile("butterfly.txt",function(Nicole)
{
    setImmediate(function(Nicole)
{
    console.log("immediate !! I'm NO.2");
});
setTimeout(function(Nicole)
{
    console.log("Timeout I'm NO.3");
},0);
});

执行结果:

https://ithelp.ithome.com.tw/upload/images/20210922/20140244AeBuab3ssI.jpg


<<:  awk - 4 常见处理案例

>>:  Day 8 - Plus One

Visual studio 2019 OpenGL setup on windows 10

OpenGL有很多library,在建置环境之前,我们需要了解要下载什麽东西 这边我们选择了GLFW...

C# .WebAPI Tuple 回传空白的问题

近期将依些老程序转移至微服务上, 因为原本程序使用了大量 out 语法, 为了能够让微服务的 API...

Day25:NavigationView

前言 前面两天刻了两个 view, 现在要用 Navigation 来把它们连接起来。 实作 在 R...

【day12】连续上班日做便当

终於要回到正轨了 其实参加这个系列 主要是期许自己 在忙碌的工作之余 还可以每天现做便当 自从上个中...

Day 23 - 绿专案管理(Green Project Management)

图片来源 继续延续前几篇的话题, 好巧不巧本月(2021年10月)刚出刊的专案经理杂志的封面故事,...