【问题标题】:NodeJS gm hanging when importing images导入图像时NodeJS gm挂起
【发布时间】:2018-04-24 16:31:17
【问题描述】:

我有以下脚本可以从 api 导入原始图像:

let importImages = function (meal,accessToken) {

  let imagesData = meal.afbeeldingenInfo;
  let mealFolder = 'client/import/meal-'+meal.maaltijdId;

  ensureExists(mealFolder, 0o755, function(err) {
    if (err) {
      winston.error('Not able to create a folder : %s', err.message);
    } else {
      winston.info('Folder %s succesfully created', mealFolder);
      for (let index in imagesData) {
        if (imagesData.hasOwnProperty(index)) {
          let imageData = imagesData[index];

          axios({
            method: 'get',
            responseType: 'stream',
            url: SYS_URL + '/MaaltijdAfbeelding/' + imageData.id,
            headers: {'Authorization': 'Bearer ' + accessToken},
          }).then(response => {
            winston.info('Got successful response from the API');
            // let image = response.data;
            let filePath = mealFolder + '/'+ imageData.name;
            response.data.pipe(fs.createWriteStream(filePath));
            winston.info('Image %s succesfully imported', imageData.name);
            response.data.on('end', () => {

              // generate images for all sizes
              for (var key in imageSizes) {
                if (imageSizes.hasOwnProperty(key)) {
                  let size = imageSizes[key];
                  gm(filePath).resize(size).strip().interlace('Line')
                    .write(mealFolder + '/' + key + '-' + imageData.name, function (err) {
                      if (!err) {
                        winston.info('Image %s successfully minimized to '+ size +'px', imageData.name)
                      } else {
                        winston.info('Not able to minimize image %s due to error: %s', imageData.name, err.message)
                      }
                    });
                }
              }
            })
          }).catch(error => {
            winston.error('Not able to import image %s due to error: %s', imageData.name, error.message);
          });
        }
      }
    }
  });
};

但是,当我执行此操作时,几秒钟后,节点脚本会完全冻结系统。

不应该以这种方式进行吗?如果是这样,调整图像大小的更好做法是什么?

【问题讨论】:

  • 如果你删除.strip().interlace()方法,它会运行吗?
  • @Stretch0 它和以前一样;它运行大约 30 到 40 张图像,然后以指数方式变慢。
  • 30 - 40 张图片?所以它实际上处理了一些并完成,但在太多之后开始失败?
  • @Stretch0 是的,正确,系统开始慢慢挂起,因为它已经处理了一些图像(可能总共 300 个)。
  • @Stretch0 好的,我认为这实际上可能会有所帮助。如果您提供答案,请将其标记为已回答。

标签: node.js gm


【解决方案1】:

听起来您一次运行了太多进程。我建议通过队列运行这些进程。

这意味着一次只运行一个进程,但如果任何任务失败,您将能够在队列中重新处理它们。 This 是一个很棒的队列运行库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2013-07-03
    • 2018-01-15
    • 2015-12-02
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多