我已经设置了一个简单的循环来轮询IronMQ消息系统,一切正常......除了内存使用量越来越多,直到最终稳定在250MB以上。我已经读过Node在这样的(某种)递归循环中运行时使用更多内存是正常的,即使在运行setTimeout并且什么都不做的时候,我仍然没有了解这种行为背后的确切机制,或者是否有任何方法可以控制它。在循环内发出HTTP请求时,内存使用量会增加一倍以上。
代码在Heroku工作程序上运行,RAM限制为512MB,没有喘息的空间来使用群集来使用剩余的可用CPU核心。内存使用量可能会缓慢或极快地增加,具体取决于收到消息后运行的作业。
这是最简单的代码,可以重现这一点。
(function loop() {
request.get('http://www.example.com', function(err, request, body) {
if (err) console.log(err);
setTimeout(loop, 200);
});
})();
我已经尝试了很多很多方法来重构这些代码,以防止内存增加如此之高,但没有任何改变。只有收到的HTTP响应似乎对使用的RAM的上限有任何影响。
有没有办法完全重写这个,还是我坚持使用V8的行为?我发现的所有示例都使用相同的基本结构来实现无限异步循环,从kue到异步库。