0

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

但是,睡眠功能需要 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));
}

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

4

1 回答 1

1

while(true)(通常)不是一个好主意。将消息排入队列后,您应该调用 dequeue 函数。dequeue 函数应该在 1. 已经有一个 dequeue 函数在运行 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();
}
于 2021-06-22T05:17:39.760 回答