# 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执行一个任务 依次循环,直到全部执行完成
🚧