我正在为节点使用GraphicsMagick。我基本上裁剪照片,并检索用户上传的照片的exif数据。我不想阻塞等待这些任务完成的请求流,因此我需要使用异步函数来做到这一点。我认为我应该能够做到这一点,因为这些都是node.js自己使其异步的I/O操作。
但在我看来,节点的GraphicsMagick中的所有函数都是同步函数。因此,我不能确定如何实现我正在寻找的目标。
我想到的一个想法是编写一个带有回调的函数,并在其中完成GraphicsMagick处理。并使用.nextTick()函数实现异步流。但我不能完全确定这是否可以。还有,GraphicsMagick有没有异步函数。
请帮助我,一个示例代码将非常感谢如何从graphicsmagick获得异步函数。
发布于 2013-07-21 14:46:12
抱歉,我的观察是错误的,虽然GraphicsMagick模块看起来像是同步函数,但它们不是。每次操作完成时,它们都会生成子进程。here已经证实了这一点。
因此,其他任何人在寻找这个问题时, 函数都是异步。而且你不需要从你的部分做任何事情。这是一个非常好的模块,值得一试。
谢谢。
发布于 2013-07-19 19:32:14
更新:
来自@Saransh Mohapatra的实际答案实际上是错误的。因为经过很少的调查发现,所有在图像上执行操作的方法,实际上不执行任何操作,而只是将参数附加到列表中,当您执行write或调用任何与缓冲区相关的方法以获取/写入实际的图像缓冲区时,该列表将被使用。
下面是blur示例中的详细信息
我们调用所有列表:https://github.com/aheckmann/gm/blob/master/lib/args.js#L780
blur,然后将其连接到this.out (to https://github.com/aheckmann/gm/blob/master/lib/command.js#L49然后,当调用write时:
write:https://github.com/aheckmann/gm/blob/master/lib/command.js#L187self.args()调用的_spawn中。因此,基于此,任何方法在图像上制作operations,但不保存或持久化它的缓冲区-不需要任何异步,因为它们实际上根本不做任何工作。所以这意味着-你确实需要担心他们。
旧版:
对于任何繁重的处理任务,最好的方法是使用分离进程。
您可以创建另一个小的主进程,它将具有一些主进程的communication功能(ZeroMQ在这里是个不错的选择)。
必须通知这个单独的进程有关文件(路径)以及如何处理它,您可以通过ZeroMQ轻松地从主进程发送数据,主进程做出这样的决定。
这种方法将允许您以main (web?)的方式使用independence。节点进程工作,以及未来扩展到单独的硬件/实例的可能性。
这也是非常好的实践(类似于的应用程序逻辑分离)。
发布于 2016-10-13 18:35:46
下面是通用汽车的解决之道:
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://stackoverflow.com/questions/17744288
复制相似问题