考虑从队列中消耗直到队列为空的并发工作者。
每个并发工作程序调用{{1}},如果在队列中找到消息,则会处理该消息。之后,letWorkerDrainQueue
以递归方式调用自身来处理下一条消息,依此类推。
请参阅下面的简明代码。
letWorkerDrainQueue
Afaik,这导致了一个非常深的嵌套的promise链,永远不能从内存中释放出来。因此,所有变量都被锁定了。在任何这些承诺中(这里//10 workers execute 'letWorkerDrainQueue' in parallel.
Promise.resolve()
.then(() => {
//irrelevant here: _.range(x) creates an array of 10 elements
return Promise.map(_.range(10), () => letWorkerDrainQueue());
})
.then(() => {
console.log("DONE (queue empty. All workers have returned)");
});
//each worker executes letWorkerDrainQueue.
//If a message is found -> it's processed + 'letWorkerDrainQueue' is called recursively to process next message
//if no message found -> letWorkerDrainQueue is done.
function letWorkerDrainQueue() {
return Promise.resolve()
.then(() => {
return receiveMessage(); // Implementation is irrelevant for question
})
.then(msg => {
if (!msg) return null; //no message on queue anymore -> let's quit this work
return Promise.resolve()
.then(() => {
return processMessage(msg); // Implementation is irrelevant for question
})
.then(() => {
//recursion happens here
return letWorkerDrainQueue();
});
}); //catch etc omitted for conciseness
}
)也不能从mem中释放出来。
这是一个问题,因为如果给定足够的时间,此过程将耗尽内存。
我将如何重组这个?我有一种唠叨的感觉,我可以通过循环来重构这种尾递归,但是如何用承诺的异步性质做到这一点超出了我。任何人吗?