GraphicsMagick asynchrone pour le noeud

J’utilise GraphicsMagick pour le noeud. En gros, je recadre les photos et récupère les données exif des photos téléchargées par l’utilisateur. Je ne veux pas bloquer le stream de demandes en attente de l’exécution de cette tâche. Je dois donc utiliser des fonctions asynchrones pour pouvoir le faire. Et je pense que je devrais pouvoir faire car ce sont des opérations d’E / S que node.js rend async lui-même.

Mais comme je vois toutes les fonctions dans GraphicsMagick pour noeud sont des fonctions synchrones. Je ne suis donc pas en mesure de savoir comment atteindre ce que je recherche.

Une idée qui me vient à l’esprit est d’écrire une fonction avec callback dans laquelle le traitement GraphicsMagick est effectué. Et utilisez la fonction .nextTick () pour obtenir un stream asynchrone. Mais je ne suis pas tout à fait sûr que ça va. Et aussi existe-t-il des fonctions asynchrones pour GraphicsMagick.

S’il vous plaît, aidez-moi et un exemple de code serait très apprécié pour obtenir des fonctions asynchrones de graphicsmagick.

    METTRE À JOUR:
    La réponse réelle de @Saransh Mohapatra est en réalité fausse. Après un examen minutieux, toutes les méthodes exécutant des opérations sur des images n’effectuent aucune opération mais ajoutent des arguments à la liste qui seront utilisés ultérieurement lorsque vous write ou appelez des méthodes associées à la mémoire tampon exécutées afin d’obtenir / écrire l’image réelle. tampon.

    Voici des détails à ce sujet dans l’exemple de blur :

    1. Nous appelons blur : https://github.com/aheckmann/gm/blob/master/lib/args.js#L780
    2. Il appelle this.out qui appellera: https://github.com/aheckmann/gm/blob/master/lib/command.js#L49
    3. Quelle méthode a été conçue pour cela lors de sa construction: https://github.com/aheckmann/gm/blob/master/lib/command.js#L34
    4. Ce que tout cela fait – a.push(arguments[i]); puis concat à toutes les listes (à d’autres arguments).
    5. C’est tout.

    Puis quand write s’appelle:

    1. https://github.com/aheckmann/gm/blob/master/lib/command.js#L62
    2. Il obtient la liste des arguments self.args() : https://github.com/aheckmann/gm/blob/master/lib/command.js#L78
    3. Ce qui ne fait que filtrer certains champs réservés: https://github.com/aheckmann/gm/blob/master/lib/command.js#L274
    4. Ainsi, ces arguments seront réunis dans _spawn appelé depuis write : https://github.com/aheckmann/gm/blob/master/lib/command.js#L187
    5. C’est tout.

    Donc, sur cette base, toute méthode qui effectue des operations sur une image, mais n’enregistre ni ne conserve sa mémoire tampon – n’a besoin d’aucun asynchrone, car elle ne fait en réalité aucun travail. Cela signifie donc que vous devez vous en préoccuper.

    VIEUX:
    La meilleure approche pour tout traitement lourd consiste à utiliser des processus séparés .
    Vous pouvez créer un autre petit processus node.js, qui aura certaines capacités de communication avec le processus principal (ZeroMQ est un bon choix ici).

    Ce processus distinct doit être notifié à propos du fichier (chemin) et de son utilisation, vous pouvez facilement envoyer ces données depuis le processus principal qui prend de telles décisions via ZeroMQ .

    Cette approche vous permettra d’avoir une indépendance dans le fonctionnement des processus de nœud principal (Web?) Et d’évoluer à l’avenir pour séparer le matériel et les instances.
    C’est également une très bonne pratique (séparation logique d’application de type Unix ).

    Et voici comment 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

    Désolé, mon observation était erronée, bien que le module GraphicsMagick semble être une fonction synchrone, mais ce n’est pas le cas. Ils génèrent un processus enfant chaque fois que la manipulation est effectuée. Et cela a été confirmé ici .

    Si tout le monde cherche ce problème, les fonctions de GraphicsMagick sont asynchrones . Et vous n’avez rien à faire de votre part. C’est un très bon module et mérite le détour.

    Merci.