【发布时间】:2016-12-08 09:19:47
【问题描述】:
我正在使用以下代码:
for (var x = 1; x < 10000000; x++) {
count++
myObj.name = count
ch.sendToQueue(queueName, new Buffer(JSON.stringify(myObj)));
}
如果我注释掉 sendToQueue 命令,它会在没有错误的情况下完成,如果我不注释它,我会收到错误:FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory。我相信这种情况正在发生,因为它将我的 sendToQueue 调用添加到回调队列中,这些调用会累积并占用内存,直到没有剩余内存为止。
有没有办法强制回调同步运行,以免它们累积?
我猜这可能不是 Node/JavaScript 的最佳用例,如果是这样的话,我希望得到确认。
我知道一种解决方案是将循环分成多个较小的循环,在这个特殊的用例中我不能这样做,它需要是一个长时间运行的循环。
【问题讨论】:
-
什么是
ch.sendToQueue?你有文件吗? -
它是用于添加到消息队列的 AMQP
-
我们必须知道
sendToQueue是什么,并且可能查看代码以了解建议的内容。当你运行一个巨大的for循环时,你不允许其他 node.js 代码在for循环期间运行(甚至包括垃圾收集),所以事情可能会堆积起来。我们需要知道sendToQueue正在做什么以及可能有哪些其他处理选项来提供帮助。 -
具体是哪个 amqp 库(请链接)?
-
可能是amqplib?适合签名。有什么东西在消耗这些消息吗?因为如果不是,它们必须存储在某处,而且内存不足一点也不奇怪。
标签: javascript node.js