我正在使用GraphicsMagick作为节点。我基本上裁剪照片并检索用户上传的照片的exif数据。我不想阻止等待这些任务完成的请求流,因此我需要使用异步函数来完成。而且我认为我应该能够这些是node.js自身异步的I / O操作。
但是我看到GraphicsMagick节点中的所有函数都是同步函数。所以我无法确定如何实现我想要的目标。
我想到的一个想法是编写一个带回调的函数,并在其中完成GraphicsMagick处理。并使用.nextTick()函数实现异步流程。但我不完全确定这是否正常。还有GraphicsMagick的任何异步函数。
请帮助我,我们非常感谢如何从graphicsmagick获取异步函数。
答案 0 :(得分:5)
<强>更新强>
来自@Saransh Mohapatra的实际答案实际上是错误的。因为经过很少的调查后发现所有对图像执行操作的方法实际上都没有执行任何操作,只是在列表中附加参数,这些参数将在您write
之后使用或调用任何与缓冲区相关的方法执行以获取/写实际图像缓冲区。
以下是blur
的示例中的详细信息:
blur
:https://github.com/aheckmann/gm/blob/master/lib/args.js#L780 this.out
,会致电:https://github.com/aheckmann/gm/blob/master/lib/command.js#L49 a.push(arguments[i]);
然后将其连接到所有列表(到其他参数)。然后调用write
时:
self.args()
:https://github.com/aheckmann/gm/blob/master/lib/command.js#L78 _spawn
write
operations
:https://github.com/aheckmann/gm/blob/master/lib/command.js#L187 因此,基于此,任何使{{1}}覆盖图像但不保存或保留缓冲区的方法 - 不需要任何异步,因为它们实际上根本不做任何工作。 这意味着 - 你需要担心它们。
<强> OLD:强>
任何重型加工的最佳方法是使用单独的流程
你可以创建另一个小的node.js进程,它与主进程有一些通信能力(ZeroMQ在这里是个不错的选择)。
这个单独的流程必须通知文件(路径)以及如何处理,您可以轻松地从主流程发送数据,通过 ZeroMQ 进行此类决策。
这种方法可以让你在main(web?)节点处理工作的方式中具有独立性,并且将来可以扩展到单独的硬件/实例。
这也是非常好的做法( unix-like 应用程序逻辑分离)。
答案 1 :(得分:4)
以下是如何宣传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);
});
答案 2 :(得分:1)
很抱歉我的观察错了,虽然GraphicsMagick模块似乎是同步功能,但它们不是。每次操作都会产生子进程。这已得到确认here。
所以其他人都在寻找这个问题, GraphicsMagick函数是异步的。而且你不需要做任何事情。它是一个非常好的模块,值得一试。
感谢。