Partage
  • Partager sur Facebook
  • Partager sur Twitter

Executer une fonction en parallèle Promise.all

Executer deux fois une même fonction en parallèle avec Promise.all

    14 janvier 2018 à 13:58:33

    Bonjour,

    dans le cadre d'une application de cryptographie, je souhaiterais pouvoir améliorer les performance de la génération de clé RSA en javascript: pour créer une clé RSA j'ai besoin de 2 nombres premiers assez grands, ce qui me demande un temps de calcul relativement long. Pour une clé de 2048 bits il me faut en moyenne 80 secondes (environ 40 secondes par nombre).

    Pour remédier à mon problème j'avais pensé utiliser le système de promesses de JavaScript et notamment Promise.all() pour calculer mes deux nombres en parallèle. Mais lorsque j’exécute mon code mes deux nombres sont encore générés l'un après l'autre et non pas en parallèle: d'où viens ce problème?

    Voici à quoi ressemble mon code de façon simplifiée:

    async function genererCle() {
        var premiers = await Promise.all([genererNombrePremier(1024), genererNombrePremier(1024)]);
        //traitements des nombres premiers reçus
    }
    
    function genererNombrePremier(tailleNombre) {
        return new Promise(function(resolve, reject) {
            //Génération d'un nombre premier x de taille <tailleNombre>
            resolve(x) //on retourne le nombre premier
        });
    }



    • Partager sur Facebook
    • Partager sur Twitter

    Le monde ne sera pas détruit par ceux qui font le mal mais par ceux qui les regardent sans rien faire. A. Einstein

      14 janvier 2018 à 15:13:06

      Je pense que tu as du mal comprendre l'utilité d'une promesse, c'est un wrapper sur des fonctions asynchrones, si ton code ne contient que un for is Prime (tu vois ce que je veux dire), ton javascript s'executera de manière lineaire.
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
        14 janvier 2018 à 16:19:18

        Stelyus a écrit:

        Je pense que tu as du mal comprendre l'utilité d'une promesse, c'est un wrapper sur des fonctions asynchrones, si ton code ne contient que un for is Prime (tu vois ce que je veux dire), ton javascript s'executera de manière lineaire.


        Merci pour cette réponse. Dans ce cas comment puis-je écrire une fonction asynchrone pour générer mes nombres premiers?
        • Partager sur Facebook
        • Partager sur Twitter

        Le monde ne sera pas détruit par ceux qui font le mal mais par ceux qui les regardent sans rien faire. A. Einstein

          14 janvier 2018 à 16:39:38

          Ton but n'est pas de faire de l'asynchrone, car ton code est lineaire, dans le sens où il ne fait pas intervenir quelqu'un de l'exterieur (ex: requete HTTP), ou il n'écoute pas des events. Bref il n'attend pas quelque chose. Toi ce que tu veux, c'est plutot paralleliser le travail, avec par exemple des threads
          • Partager sur Facebook
          • Partager sur Twitter
          Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
            14 janvier 2018 à 16:48:25

            En effet il semblerait que j'ai mal compris l’intérêt des fonctions asynchrone : je pensais que l'on pouvait exécuter du code (linéaire) en parallèle grâce aux fonctions asynchrones et récupérer leur résultat via un callback. Comment est-ce que je peux paralléliser mes calculs via JavaScript?

            -
            Edité par Æyno 14 janvier 2018 à 16:48:37

            • Partager sur Facebook
            • Partager sur Twitter

            Le monde ne sera pas détruit par ceux qui font le mal mais par ceux qui les regardent sans rien faire. A. Einstein

              14 janvier 2018 à 16:53:28

              Malheuresement, le node js (je suppose que tu utilise nodejs) n'implèmente pas nativement ce genre de choses. Tu peux cependant utiliser des librairies comme celui la: https://github.com/audreyt/node-webworker-threads
              • Partager sur Facebook
              • Partager sur Twitter
              Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
                14 janvier 2018 à 17:10:31

                Très bien, merci pour toutes ces réponses, je vais me renseigner sur le sujet (j'ai vu que les WebWorkers semblaient aussi être implémentés dans les navigateurs).
                • Partager sur Facebook
                • Partager sur Twitter

                Le monde ne sera pas détruit par ceux qui font le mal mais par ceux qui les regardent sans rien faire. A. Einstein

                  15 janvier 2018 à 12:18:14

                  Stelyus a écrit:

                  Malheuresement, le node js (je suppose que tu utilise nodejs) n'implèmente pas nativement ce genre de choses. Tu peux cependant utiliser des librairies comme celui la: https://github.com/audreyt/node-webworker-threads


                  Humm... https://nodejs.org/docs/latest/api/cluster.html

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Un petit +1 si je vous ai aidé est toujours appréciable :).
                    15 janvier 2018 à 13:08:40

                    De mémoire, les clusters sont basés sur des forks, qui ne partagent pas la mémoire entre eux et qui rajoute un process, ce qui ne fais pas de lui un thread
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
                      15 janvier 2018 à 14:50:58

                      Stelyus a écrit:

                      De mémoire, les clusters sont basés sur des forks, qui ne partagent pas la mémoire entre eux et qui rajoute un process, ce qui ne fais pas de lui un thread


                      Tu peux lancer un process par coeur donc tu peux faire du "multi-thread". Mais effectivement la memoire n'est pas partagée.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Un petit +1 si je vous ai aidé est toujours appréciable :).

                      Executer une fonction en parallèle Promise.all

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown