在Node.js中,有哪些方法可以管理多个内存/ CPU密集型异步操作?

时间:2015-06-24 14:47:09

标签: node.js

为了理解异步编程,特别是node.js,我创建了一个小应用程序,它从一个充满图像的目录中创建一个基于Web的图像库。

当浏览器指向目录时(我使用Express作为中间件/路由,而Jade和Bootstrap 3作为视图/演示文稿),应用程序会加载目录中的所有图像,切出12个它们(有一个允许用户一次退出/推进12个图像的寻呼机),并通过gm module使用GraphicsMagick生成缩略图。

如果原始图像相当小,缩略图生成不是特别占用内存/ CPU,但如果它们更大,应用程序有时会耗尽内存并死掉。

正如我所说的,我是一个相对node.js初学者,我没有扎实的Comp Sci背景,但我熟悉垃圾收集等概念。管理内存的方法有哪些?处理器使用率从用户的角度来看不会对应用程序的整体速度产生负面影响(即,不会使缩略图页面加载速度变慢)。

有问题的逻辑是in this file,我试图对其进行评论以使其易于理解。我将再次重申,我不是一名专业程序员,也不是我的node.js专家,所以我确信风格失误很多。请随意批评任何事情,我很乐意收到任何反馈。 (我很高兴我已经掌握了足够的东西让它起作用。)

1 个答案:

答案 0 :(得分:0)

我们已经确定运行12个GM实例会导致问题,特别是当他们必须处理大型图像时。

您可以考虑使用async#queue(或密切相关的async#eachLimitasync#mapLimit)来运行您在composeResults()中拥有的大部分代码。

举一个如何工作的例子,考虑一个并发为2的队列:

var async = require('async');

var someTaskThatTakesTime = function(item, taskDone) {
  // We'll fake a long-running task by using a timeout
  console.log('START', item);
  setTimeout(function() {
    console.log('DONE ', item);
    taskDone();
  }, 1000);
};

var queue = async.queue(someTaskThatTakesTime, 2);

for (var i = 0; i < 12; i++) {
  queue.push(i);
}

在您的情况下,someTaskThatTakesTime()将运行缩略图生成代码。将单个文件作为“任务”,为其生成缩略图,并在完成后调用taskDone

由于并发限制,它将阻止两个以上的GM运行实例。您可以轻松地在上面的示例代码中看到这种情况。

这需要对代码进行一些重组。一种可能性是首先将需要处理的所有文件收集到一个数组中并处理该数组(在这种情况下async#eachLimit比使用队列更有意义。)