Asynchronous GraphicsMagick For Node

旧城冷巷雨未停 提交于 2019-11-29 16:13:10

UPDATE:
The actual answer from @Saransh Mohapatra is actually wrong. As after little investigation turned out that all methods that perform operations over images, actually do not perform anything but only append arguments to the list that will be used after when you write or call any buffer related methods executed in order to get/write actual image buffer.

Here is details over it in example of blur:

  1. We call blur: https://github.com/aheckmann/gm/blob/master/lib/args.js#L780
  2. It calls this.out which will call: https://github.com/aheckmann/gm/blob/master/lib/command.js#L49
  3. Which has method made for it when it was constructed: https://github.com/aheckmann/gm/blob/master/lib/command.js#L34
  4. Which all it does - a.push(arguments[i]); and then concats it to all list (to other arguments).
  5. Thats it.

Then when write is called:

  1. https://github.com/aheckmann/gm/blob/master/lib/command.js#L62
  2. It gets list of arguments self.args(): https://github.com/aheckmann/gm/blob/master/lib/command.js#L78
  3. Which just filters off some reserved fields: https://github.com/aheckmann/gm/blob/master/lib/command.js#L274
  4. So then those arguments will be joined in _spawn which is called from write: https://github.com/aheckmann/gm/blob/master/lib/command.js#L187
  5. Thats it.

So based on this, any method that makes operations over image, but do not save or persist buffer of it - do not need any async, as they actually do not do any work at all. So that means - you do need to worry about them.

OLD:
The best approach for any heavy processing stuff is to use separate processes.
You can create another small node.js process, that will have some communication abilities with main process (ZeroMQ is good choice here).

This separate process have to be notified about file (path) and what to do with it, you can easily send that data from main process which makes such decisions via ZeroMQ.

This approach will allow you to have independence in the way main (web?) node processes work, as well as possibility in the future to scale to separate hardware/instances.
It is very good practice as well (unix-like application logic separation).

And here is how to promisify 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

Sorry my observation was mistaken, though the GraphicsMagick module seems as synchronous function but they are not. They spawn child process each time manipulation is done. And this has been confirmed here.

So anyone else looking for this problem, GraphicsMagick functions are Asynchronous. And you don't have to do anything from your part. Its a very good module and worth checking out.

Thanks.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!