问题描述
我正在尝试使用队列提高处理工作人员传入消息的性能。
但是,睡眠功能需要 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();
}