带承诺的 NodeJS 睡眠时间太长

问题描述

我正在尝试使用队列提高处理工作人员传入消息的性能

但是,睡眠功能需要 16 到 30 毫秒的时间才能完成,而不是 1 毫秒。有没有更好的方法来处理队列而不会有这么大的延迟,并且不让我的应用保持 100% 的 cpu

我正在做这样的事情:

var actions = new Queue();
parentPort.on('message',(msg) => actions.enqueue(msg));

loopy();

async function loopy() {
    while (true) {
        if (actions.size() > 0) {
            let action = actions.dequeue();
            //do work
            continue; 
        }

        await sleep(1);
    }
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve,ms));
}

任何帮助将不胜感激。谢谢!

解决方法

while(true)(通常)不是一个好主意。 您应该在将消息入队后调用出队函数。出队函数应该在 1. 已经有出队函数在运行 2. 队列中没有消息时结束。

var isProcessing = false;
var actions = new Queue();
parentPort.on('message',(msg) => {
  actions.enqueue(msg)
  tryDequeue();
});


async function tryDequeue() {
    if(isProcessing || actions.size() == 0)
    {
      return;
    }
    isProcessing = true;

    let action = actions.dequeue();
    //do work
    
    isProcessing = false;
    tryDequeue();
}