关于node的消息队列与工作队列

本文探讨了JavaScript中工作队列与消息队列的区别,通过游乐园过山车的比喻,解释了如何利用setTimeout实现消息队列,而Promise的resolve则展示了工作队列的特性,使得任务执行顺序更可控。
// 有个游乐园中过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,
// 而工作队列则是快速通道票,这样你就可以在完成上一次乘车后立即乘坐另一趟车。
const bar = () => console.log('bar')

const baz = () => console.log('baz')

const foo = () => {
  console.log('foo')
  // 消息队列
  setTimeout(bar, 0)
  // 工作队列
  // 所谓工作队列,是有别于消息队列的另外一种队列,
  // 不同之处在于,在当前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。
  new Promise((resolve, reject) =>
    resolve('应该在 baz 之后、bar 之前')
  ).then(resolve => console.log(resolve))
  baz()
}

foo()
### Node.js 中的消息队列实现使用 #### 什么是消息队列? 在 Node.js 中,消息队列是事件循环的一部分。事件循环通过维护两个主要的队列来管理异步操作:宏任务队列(Macro-task Queue)和微任务队列(Micro-task Queue)。当某些异步操作完成时,它们会被放入相应的队列中等待执行。 #### 宏任务微任务的区别 - **宏任务**包括 `setTimeout`、`setInterval` 和 I/O 操作等。这些任务会在当前事件循环的一次迭代完成后被调度到下一次迭代中执行[^1]。 - **微任务**则由 `Promise.then` 或 `process.nextTick` 创建的任务组成。微任务具有更高的优先级,在每次事件循环结束前会先清空微任务队列[^4]。 以下是两种常见场景下的代码示例: #### 使用 `setTimeout` 添加宏任务 ```javascript console.log('Start'); setTimeout(() => { console.log('Timeout'); }, 0); console.log('End'); ``` 在这个例子中,“Start” 和 “End” 将立即打印出来,而 `setTimeout` 的回调函数将在下一个事件循环周期被执行。 #### 微任务的使用 (`Promise`) ```javascript console.log('Start'); Promise.resolve().then(() => { console.log('Promise resolved'); }); console.log('End'); ``` 这里,“Start” 和 “End” 是同步部分的内容,因此会立刻显示;随后,`Promise` 的 `.then()` 方法作为微任务被加入微任务队列并优先于任何宏任务执行。 #### 自定义消息队列模拟 虽然 Node.js 提供了内置的支持用于处理各种类型的异步任务,但在特定情况下可能需要自定义一个简单的消息队列系统。下面展示如何创建这样一个基本模型: ```javascript class MessageQueue { constructor() { this.queue = []; } enqueue(task) { // 向队列添加新任务 this.queue.push(task); } processNext() { // 处理队首任务 const task = this.queue.shift(); if (task) { task(); } } startProcessing(intervalMs = 1000) { // 开始按指定间隔时间轮询队列中的任务 setInterval(() => { this.processNext(); }, intervalMs); } } const mq = new MessageQueue(); mq.enqueue(() => console.log('Task A')); mq.enqueue(() => console.log('Task B')); mq.startProcessing(200); // 设置每200ms检查一次是否有待处理任务 ``` 上述类实现了基础的消息队列功能,允许用户向其中添加新的任务并通过定时器逐步消耗掉这些任务[^3]。 #### 总结 Node.js 利用了事件驱动架构以及非阻塞I/O模式使其非常适合构建高吞吐量的应用服务[^2]。理解其内部工作机制特别是关于事件循环的知识可以帮助开发者更有效地利用资源并解决潜在性能瓶颈问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值