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.
J'ai créé une classe par thread (fitnessCompute1 et fitnessCompute2) qui lance chacun dans leur run une partie.
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)
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 !
Partager