IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de Thread [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut Problème de Thread
    Bonjour !

    Je suis entrain d'écrire un algorithme génétique pour optimiser des valeurs d'une IA pour le jeu Othello.
    Dans mon algorithme génétique, je calcule une valeur de "fitness" qui est nécessaire pour la suite. Le problème est qu'elle lance 2 parties d'Othello pour la calculer.
    J'ai voulu alors paralléliser ce calcul en lançant chaque partie sur un thread. Donc 2 thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def fitnessRank(new_population):
        fitness_result = {}
        for i in range(0,len(new_population)):
            thread_1 = fitnessCompute1.fitnessCompute1(randomPlayer.myPlayer(),myPlayer.myPlayer(new_population[i])) #Blanc
            thread_2 = fitnessCompute2.fitnessCompute2(myPlayer.myPlayer(new_population[i]),randomPlayer.myPlayer()) #Noir
            thread_1.start()
            thread_2.start()
     
            thread_1.join()
            thread_2.join()
     
            nb_whites = thread_1.result
            nb_blacks = thread_2.result
            nb_pieces_game_1 = nb_whites
            nb_pieces_game_2 = nb_blacks
     
            fitness_result[i] = ((nb_pieces_game_2 - nb_pieces_game_1)/2) #Valeur fitness
            print("Game effectuée :",i)
        print("FitnessResult tab = ", fitness_result)
        return sorted(fitness_result.items(), key = operator.itemgetter(1), reverse = True)
    J'ai créé une classe par thread (fitnessCompute1 et fitnessCompute2) qui lance chacun dans leur run une partie.
    Mon problème étant le suivant: Je suis fasse à un blocage d'un des threads avec un des deux join(). En effet, je suppose qu'un thread fini avant l'autre et bloque ainsi l'autre avec le join. (Ce qui n'est peut-être pas le cas, ma connaissance des threads avec python est très limité.). Je termine donc avec une attente infinie, et mon programme ne continue plus de s'exécuter.
    Mon but étant le suivant: Attendre que les deux threads se finissent avant de continuer. Il semblerait que le join() fasse office de "barrière", mais me provoque une attente infini à certains moment.

    Je me demandais alors, est-ce bien écrit ce que je voulais ?

    Je vous remercie d'avance pour votre aide sur mon problème !

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Tu pourrais passer à tes classes une fonction de callback à laquelle envoyer les résultats lorsque le thread s'arrête de lui même, fonction de callback qui pourrait recevoir un identifiant et le résultat, l'identifiant pourrait être le i du range + le numéro du thread ou même l'identifiant du thread, enfin quelque chose d'unique.

    Et lorsque ta fonction de callback a reçu tous les résultats attendus, les traiter.

    Car il me semble que le join est destiné à un thread maître gérant plusieurs threads.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par LePtitBen Voir le message
    Mon problème étant le suivant: Je suis fasse à un blocage d'un des threads avec un des deux join(). En effet, je suppose qu'un thread fini avant l'autre et bloque ainsi l'autre avec le join. (Ce qui n'est peut-être pas le cas, ma connaissance des threads avec python est très limité.). Je termine donc avec une attente infinie, et mon programme ne continue plus de s'exécuter.
    Vous supposez?
    Vous pourriez écrire un exemple de code avec 2 threads pour voir si le .join sur un thread bloque l'exécution de l'autre. Le résultat vous donnerait la réponse à votre "supposition".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Désolé de ma réponse un peu tardive, je suis en pleine période d'examen.

    Je n'ai pas bien compris ta solution Bidouille, en quoi cette fonction pourrait résoudre mon problème ? Car une fois que mon thread a fini sa method run, il stock le résultat dans une variable result, que je récupère par la suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  2. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  3. [Kylix] Problème de thread
    Par moltov dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2005, 13h28
  4. [Kylix] Problème de thread
    Par A&Nexus dans le forum EDI
    Réponses: 1
    Dernier message: 03/05/2005, 21h48
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo