# Node

# 两个Node进程如何通信 (opens new window)

  • 不同电脑上的两个Node进程通信 通常使用 TCP 或者 HTTP 进行通信
  • 同一台电脑上两个Node进程通信
    • 进程与自己创建的子进程,可以使用内置的IPC通信
    • 进程与别的不相关的进程通信,可以使用自定义管道

# Node 与浏览器 EventLoop 的区别

  • 浏览器事件循环有两个默认事件队列
    • 宏任务队列
    • 微任务队列
  • Node 根据任务的种类和优先级,分成了 6 个阶段来执行异步任务
    • 定时器(timers):该阶段用于判断是否执行定时器回调
    • 待定回调(pending callbacks):用于执行网络I/O 等异常时的回调;执行上一轮残留的回调
    • idle,prepare:仅系统内部使用
    • 轮询(poll):该阶段用于执行 所有其他阶段不处理的 I/O回调 + 检索新的I/O事件
      • 生成该阶段预设阻塞的时间 + 预设轮询I/O 的时间
      • 执行大多数的网络I/O,文件I/O
      • 如果轮询队列不为空,遍历队列同步执行回调,直到队列为空
      • 如果为空
        • 如果有 setimmediate 回调需要执行,立即结束 poll 阶段,并进入 check 阶段
        • 如果没有 setimmediate 回调需要执行,则停留在该阶段以等待回调被添加到队列中,然后立即执行。在超时时间到达前,事件循环会一直停留等待
    • 检测(check):setimmediate 回调函数在这里执行
    • 关闭的回调函数(close callbacks):用于执行一些关闭资源的回调,优先级最低
   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤      close callbacks      │
   └───────────────────────────┘

TIP

node11 之后,微任务的调度会穿插在每一个timers任务执行之中: timers执行一个任务 -> 清空process.nextTick() + promise.then() 任务队列 -> timers执行一个任务 依次循环,直到全部执行完成

🚧