如何使用固定数量的工作者处理无限队列?

ijxebb2r  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(241)

我正在为一个web应用程序进行缓存失效处理。期望的行为是,当有人访问配置文件页面时,将触发对该用户数据的重述。我只想一次最多运行k个更新作业。
我提出了以下javascript来创建异步迭代器,在等待输入时可以阻止该迭代器:

const pipeline = {
  queue: [],
  resolve: null,
  hold: null,
  [Symbol.asyncIterator]() {
    return {
      async next() {
        while(pipeline.queue.length === 0) {
          if(pipeline.hold === null) {
            pipeline.hold = new Promise(resolve => {
              pipeline.resolve = resolve
            })
          }
          await pipeline.hold
          pipeline.hold = null
        }
        return Promise.resolve({
          done: false, value: pipeline.queue.shift()
        })
      }
    }
  },
  enqueue(id) {
    this.queue.push(id)
    const resolve = this.resolve
    this.resolve = null
    resolve?.()
  },
}

我用来处理队列的代码是按照异步批处理建模的:

const next = async () => {
  await Promise.all(
    Array(5).fill(null).map(async (_, idx) => {
      for await (let id of pipeline) {
        await handler(id, idx)
      }
    })
  )
}

如果我从包含超过k个元素的队列开始,那么所有插槽都将用于处理。如果我从一个或两个元素开始,它只使用前两个插槽。
有人看到我逻辑上的缺陷吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题