2

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

但正如我所见,GraphicsMagick for node 中的所有函数都是同步函数。所以我无法确定如何实现我想要的。

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

请帮助我,非常感谢如何从 graphicsmagick 获取异步函数的示例代码。

4

3 回答 3

6

更新:
@Saransh Mohapatra 的实际答案实际上是错误的。经过很少的调查后发现,所有对图像执行操作的方法实际上不执行任何操作,只是将参数附加到列表中,当您write或调用执行任何缓冲区相关方法以获取/写入实际图像缓冲区时将使用这些参数.

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

  1. 我们调用blurhttps ://github.com/aheckmann/gm/blob/master/lib/args.js#L780
  2. 它调用this.out哪个会调用:https ://github.com/aheckmann/gm/blob/master/lib/command.js#L49
  3. 构造时有哪些方法:https ://github.com/aheckmann/gm/blob/master/lib/command.js#L34
  4. 它所做的一切 -a.push(arguments[i]);然后将它连接到所有列表(到其他参数)。
  5. 就是这样。

然后何时write调用:

  1. https://github.com/aheckmann/gm/blob/master/lib/command.js#L62
  2. 它获取参数列表self.args()https ://github.com/aheckmann/gm/blob/master/lib/command.js#L78
  3. 这只是过滤掉一些保留字段:https ://github.com/aheckmann/gm/blob/master/lib/command.js#L274
  4. 那么这些参数将被加入_spawn其中,从以下位置调用writehttps ://github.com/aheckmann/gm/blob/master/lib/command.js#L187
  5. 就是这样。

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

OLD:
对于任何繁重的处理内容,最好的方法是使用单独的进程
您可以创建另一个小的 node.js 进程,它将与主进程具有一些通信能力(ZeroMQ 是这里的不错选择)。

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

这种方法将使您能够独立于主(Web?)节点进程的工作方式,以及将来扩展到单独的硬件/实例的可能性。
这也是非常好的实践(类 Unix应用程序逻辑分离)。

于 2013-07-19T11:32:14.273 回答
5

这是承诺 gm 的方法:

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

于 2016-10-13T10:35:45.960 回答
1

抱歉,我的观察是错误的,虽然 GraphicsMagick 模块似乎是同步函数,但它们不是。每次操作完成时,它们都会产生子进程。而这已经在这里得到了证实。

所以任何其他寻找这个问题的人,GraphicsMagick函数都是 Asynchronous。而且您不必做任何事情。它是一个非常好的模块,值得一试。

谢谢。

于 2013-07-21T06:46:12.157 回答