Partage
  • Partager sur Facebook
  • Partager sur Twitter

Multi-threading

Problème avec le multi-threading sur un de mes codes

    19 janvier 2021 à 15:41:54

    Salut à vous !

    Je suis entrain de coder un generateur de mot aléatoire à partir de la bibliothèque string.

    J'ai fait en sorte qu'on puisse choisir la taille des mots (3 à 12 lettres).

    J'ai cherché sur internet comment générer une liste de mots de taille différente en même temps, et je suis tombé sur le multi-threading. Ca avait l'air simple !

    J'ai donc créer 12 thread, puis je les lance avec start().

    Mes 2 premiers threads se lancent sans soucis mais pas les 7 autres.

    Quelqu'un saurait pourquoi ?

    Voici le code :

    th1 = threading.Thread(target=Command_crypt.hazard_word(a, m, max, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico.txt", "w"), name="3_letters")
    th2 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 1, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico2.txt", "w"), name="4_letters")
    th3 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 2, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico3.txt", "w"), name="5_letters")
    th4 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 3, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico4.txt", "w"), name="6_letters")
    th5 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 4, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico5.txt", "w"), name="7_letters")
    th6 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 5, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico6.txt", "w"), name="8_letters")
    th7 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 6, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico7.txt", "w"), name="9_letters")
    th8 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 7, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico8.txt", "w"), name="10_letters")
    th9 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 8, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico9.txt", "w"), name="11_letters")
    th10 = threading.Thread(target=Command_crypt.hazard_word(a, m, max + 9, "C:\\Users\\Flavien\\Desktop\\dictionnaire\\dico10.txt", "w"), name="12_letters")
    
    th1.start()
    th2.start()
    th3.start()
    th4.start()
    th5.start()
    th6.start()
    th7.start()
    th8.start()
    th9.start()
    th10.start()

    Du coup, seul le th1 et 2 se lance. Puis quand th1 se termine, th3 démarre...

    Dans mon dossier j'ai bien dico1 et dico2 en meme temps, puis arrive dico3... Mais les threads ne fonctionnent pas en même temps.

    Merci d'avance de votre aide,

    Bonne fin de journée,

    Flavien

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2021 à 15:58:31

      Pour que N activités puissent se dérouler "en même temps", il faudrait qu'il y ait N CPU (processeurs) pour les exécuter. Malheureusement, avec Python, la synchronisation d'accès aux structures de données internes (le global lock) fait qu'on ne pourra utiliser qu'un seul CPU... et les N threads vont se partager un seul CPU: çà n'ira pas plus vite et le "en même temps" sera relatif.

      Regardez un peu le multiprocessing, çà résout partiellement le problème.

      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2021 à 16:05:37

        mps a écrit:

        Pour que N activités puissent se dérouler "en même temps", il faudrait qu'il y ait N CPU (processeurs) pour les exécuter. Malheureusement, avec Python, la synchronisation d'accès aux structures de données internes (le global lock) fait qu'on ne pourra utiliser qu'un seul CPU... et les N threads vont se partager un seul CPU: çà n'ira pas plus vite et le "en même temps" sera relatif.

        Regardez un peu le multiprocessing, çà résout partiellement le problème.

        Même si dans un CPU il y a plusieurs coeurs ?

        J'ai un R5 2600x, du coup 6coeurs/6threads, je ne peux donc utiliser que 2 threads d'1 coeur ?

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2021 à 17:19:52

          un coeur = un CPU = un processeur, ce sur quoi on peut exécuter un processus ou un threads.

          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2021 à 18:08:26

            ca marche, merci !

            Dernière question, Le th1 fini dico 1 et y se lance dans dico3, mais quand th2 termine dico2, il se lance pas dans th4, tu sais pourquoi ?

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2021 à 19:03:00

              Il n'y a pas d'ordre prévisible dans l'exécution des threads, c'est l'ordonnanceur de l'OS qui gère ça.
              • Partager sur Facebook
              • Partager sur Twitter

              Blond, bouclé, toujours le sourire aux lèvres...

                19 janvier 2021 à 19:20:39

                LoupSolitaire a écrit:

                Il n'y a pas d'ordre prévisible dans l'exécution des threads, c'est l'ordonnanceur de l'OS qui gère ça.


                Evidemment, mais du coup comment je peux le lancer ?
                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2021 à 19:51:34

                  Tu veux dire qu'il se lance pas du tout, et que le programme termine sans faire cette tâche ?

                  Parce que normalement une fois que tu as lancé tous les threads il suffit d'attendre que tout se termine.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Blond, bouclé, toujours le sourire aux lèvres...

                    19 janvier 2021 à 20:37:55

                    LoupSolitaire a écrit:

                    Tu veux dire qu'il se lance pas du tout, et que le programme termine sans faire cette tâche ?

                    Parce que normalement une fois que tu as lancé tous les threads il suffit d'attendre que tout se termine.


                    En fait, je lance le programme : th1 et th2 se lancent. (mes 2 threads sont donc occupés) Mais, quand th1 se termine, th3 se lance (j'ai donc th2 et th3 en cours, mes 2 threads sont occupés). Mais quand th2 s'arrête, th4 ne se lance pas (du coup j'ai seulement th3 en cours). J'aimerais du coup, que th4 travaille en même temps que th3.

                    (en schéma) :

                    === lancement programme ===

                    -> th1 & th2

                    => th1 terminé, lancement th3

                    -> th2 & th3

                    => th2 terminé, th4 ne se lance pas

                    -> th3 uniquement

                    Et je voudrais que th4 travaille en même temps que th3, comme th1 avec th2...

                    J'espère que j'ai bien expliqué

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 janvier 2021 à 22:18:07

                      Je pense pareil que mps : le multiprocessing peut aider à avoir plus de process qui tournent en parallèle : https://docs.python.org/fr/3/library/multiprocessing.html
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Blond, bouclé, toujours le sourire aux lèvres...

                        20 janvier 2021 à 10:46:11

                        Ca marche,

                        J'ai regarder la doc python, j'ai essayé mais aps trouvé, sur youtube non plus.

                        Je comprendrais peut etre plus tard.

                        Merci de votre aide,

                        Bonne journée a tous !

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 janvier 2021 à 23:19:41

                          Le vrai problème c'est que l'argument target attend une fonction et non le résultat d'une fonction...

                          threads = []
                          for n in range(10):
                              arguments = a, m, max + n, f"C:/.../dico{n}.txt", ...
                              thread = Thread(target=function, args=arguments, ...)
                              thread.start()
                              threads.append(thread)
                          
                          ...
                          
                          for thread in threads:
                              thread.join()
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Multi-threading

                          × 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