首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点的异步GraphicsMagick

节点的异步GraphicsMagick
EN

Stack Overflow用户
提问于 2013-07-19 18:48:44
回答 3查看 5.7K关注 0票数 2

我正在为节点使用GraphicsMagick。我基本上裁剪照片,并检索用户上传的照片的exif数据。我不想阻塞等待这些任务完成的请求流,因此我需要使用异步函数来做到这一点。我认为我应该能够做到这一点,因为这些都是node.js自己使其异步的I/O操作。

但在我看来,节点的GraphicsMagick中的所有函数都是同步函数。因此,我不能确定如何实现我正在寻找的目标。

我想到的一个想法是编写一个带有回调的函数,并在其中完成GraphicsMagick处理。并使用.nextTick()函数实现异步流。但我不能完全确定这是否可以。还有,GraphicsMagick有没有异步函数。

请帮助我,一个示例代码将非常感谢如何从graphicsmagick获得异步函数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-21 14:46:12

抱歉,我的观察是错误的,虽然GraphicsMagick模块看起来像是同步函数,但它们不是。每次操作完成时,它们都会生成子进程。here已经证实了这一点。

因此,其他任何人在寻找这个问题时, 函数都是异步。而且你不需要从你的部分做任何事情。这是一个非常好的模块,值得一试。

谢谢。

票数 1
EN

Stack Overflow用户

发布于 2013-07-19 19:32:14

更新:

来自@Saransh Mohapatra的实际答案实际上是错误的。因为经过很少的调查发现,所有在图像上执行操作的方法,实际上不执行任何操作,而只是将参数附加到列表中,当您执行write或调用任何与缓冲区相关的方法以获取/写入实际的图像缓冲区时,该列表将被使用。

下面是blur示例中的详细信息

我们调用所有列表:https://github.com/aheckmann/gm/blob/master/lib/args.js#L780

  • Which arguments).

  • Thats
  1. -blur,然后将其连接到this.out (to https://github.com/aheckmann/gm/blob/master/lib/command.js#L49
  2. Whichhttps://github.com/aheckmann/gm/blob/master/lib/command.js#L34
  3. Which it.

然后,当调用write时:

  1. https://github.com/aheckmann/gm/blob/master/lib/command.js#L62
  2. It获取参数列表:https://github.com/aheckmann/gm/blob/master/lib/command.js#L78
  3. Which只是过滤掉一些保留字段:https://github.com/aheckmann/gm/blob/master/lib/command.js#L274
  4. So,然后这些参数将被连接到从writehttps://github.com/aheckmann/gm/blob/master/lib/command.js#L187
  5. Thats it.self.args()调用的_spawn中。

因此,基于此,任何方法在图像上制作operations,但不保存或持久化它的缓冲区-不需要任何异步,因为它们实际上根本不做任何工作。所以这意味着-你确实需要担心他们。

旧版

对于任何繁重的处理任务,最好的方法是使用分离进程

您可以创建另一个小的主进程,它将具有一些主进程的communication功能(ZeroMQ在这里是个不错的选择)。

必须通知这个单独的进程有关文件(路径)以及如何处理它,您可以通过ZeroMQ轻松地从主进程发送数据,主进程做出这样的决定。

这种方法将允许您以main (web?)的方式使用independence。节点进程工作,以及未来扩展到单独的硬件/实例的可能性。

这也是非常好的实践(类似于应用程序逻辑分离)。

票数 5
EN

Stack Overflow用户

发布于 2016-10-13 18:35:46

下面是通用汽车的解决之道:

代码语言:javascript
复制
var Promise = require('bluebird');
var gm = require('gm').subClass({imageMagick: true});
Promise.promisifyAll(gm.prototype);

gm('1.jpg')
  .resize(240, 240)
  .noProfile()
  .writeAsync('1b.jpg')
  .then(function () {
    console.log('done');
  });
  .catch(function (err) {
    console.log(err);
  });

https://github.com/aheckmann/gm/issues/320

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17744288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档