防止递归承诺和相关的无法释放mem

时间:2017-03-29 13:56:17

标签: javascript recursion memory-leaks promise bluebird

考虑从队列中消耗直到队列为空的并发工作者。

每个并发工作程序调用{​​{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中释放出来。

这是一个问题,因为如果给定足够的时间,此过程将耗尽内存。

我将如何重组这个?我有一种唠叨的感觉,我可以通过循环来重构这种尾递归,但是如何用承诺的异步性质做到这一点超出了我。任何人吗?

0 个答案:

没有答案