Salutations,

Je suis en ce moment en train d'essayer de coder un programme utilisant le module threading. Le principe est de lancer plusieurs threads, chacun réalisant diverses actions avant de se mettre en écoute.
Dans mon code test, au moment d'arriver à la fonction start ci-dessous, self.nodes contient quatre items, ce qui devrait causer l'apparition de quatre threads.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
    def start(self):
        """
        The start function starts the execution of a thread for each worker,
        running their respective code.
        """
        if self.check_neighbourhood() :
            for node in self.nodes :
                print "awakening node ", node
                self.threads[node]=threading.Thread(target=self.nodes[node].start(),
                                                    name=node)
                print "starting node ", node
                self.threads[node].start()
L'éxécution de self.nodes[node].start() entraîne à un moment donné l'éxécution de la fonction mailbox_check, qui normalement attend qu'un message soie arrivé pour faire plein de choses merveilleuses, ceci pour chacun des threads.
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 mailbox_check(*args):
            node_name = args[0]
            if not node_name in self.overseer.nodes :
                print "postman went to wrong node :", node_name
                return
            while self.overseer.running :
                print "step 1", node_name
                self.overseer.nodes[node_name].mailbox_event.wait()
                print "step 2", node_name
                self.overseer.nodes[node_name].mailbox_use.acquire()
                print "step 3", node_name
                current_message = self.overseer.nodes[node_name].mailbox.pop(0)
                print "step 4", node_name
                if len(self.overseer.nodes[node_name].mailbox) == 0 :
                    self.overseer.nodes[node_name].mailbox_event.clear()
                self.overseer.nodes[node_name].mailbox_use.release()
                function(current_message)
                time.sleep(0.000001)
                print "step 5", node_name
Le soucis (car bien sûr, il y en a un), c'est que les logs donnent ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
Node created : 1
Node created : 2
Node created : 3
Node created : 4
awakening node  1
step 1 1
 
 ((à ce moment, le programme attend indéfiniment))
En gros, le programme crée le premier thread (qui je ne sais pas comment, commence à s'éxécuter avant le premier thread.start()), et ne touche pas aux suivants. De plus, l'instruction :
self.overseer.nodes[node_name].mailbox_event.wait()
n'est pas dépassée, ce qui me pose soucis. Normalement, au moment du wait, le thread devrait rendre la main et le programme devrait continuer, mais cela n'arrive pas.

J'ai essayé de me renseigner sur le fonctionnement de threading, qui m'a renvoyé aux conclusions ci-dessus, ainsi qu'aux autres problèmes qui auraient pu engendrer ceci, mais je n'ai pas trouvé.

Merci d'avance.

ps : Afin de vous éviter de lire trop de lignes de code, j'ai mis seulement une partie du programme. Cependant, si le soucis est susceptible de provenir d'ailleurs (la fonction mailbox_check est utilisée comme un wraper pour function, je ne sais pas si ça pourrait jouer), n'hésitez pas à en demander plus .

edit : problem solved. Comme d'habitude, c'est quand on se casse la tête que c'est simple .