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.
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.
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 ?
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...
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()
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.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...