Maison >développement back-end >Tutoriel Python >Pourquoi mon thread s'exécute-t-il avant d'appeler « Thread.start() » en Python ?
Le thread commence à s'exécuter avant d'appeler Thread.start
En Python, le threading permet la création et l'exécution de plusieurs threads au sein d'un seul programme. Une idée fausse courante est que les threads commencent à s’exécuter immédiatement après avoir été créés, même sans appeler explicitement Thread.start(). Cependant, ce n'est pas le cas.
Considérez l'extrait de code suivant :
import threading t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
Dans cet exemple, deux threads t1 et t2 sont créés mais aucun d'eux n'est encore démarré. La fonction self.read() s'exécute indéfiniment, ce qui signifie que le programme n'atteindra jamais la ligne d'impression. Ce comportement se produit même si t1.start() n'est pas appelé, ce qui devrait démarrer le thread puis passer à la ligne suivante.
La raison de ce comportement inattendu réside dans les parenthèses de fin après target=self. lire(). Cette syntaxe appelle en fait immédiatement la fonction self.read() et transmet la valeur de retour comme argument cible au constructeur Thread. Comme Python s'attend à ce qu'une fonction soit transmise comme cible, la solution consiste à supprimer les parenthèses de fin et à appeler explicitement t1.start() pour démarrer le fil :
import threading t1 = threading.Thread(target=self.read) t1.start() print("something")
Alternativement, si la fonction cible nécessite des arguments , vous pouvez utiliser les arguments args et kwargs pour threading.Thread ou définir une fonction lambda à transmettre au constructeur. N'oubliez pas que si vous choisissez d'utiliser un lambda, il recherchera la fonction et ses arguments lorsque le thread est planifié, et non lorsque le lambda est défini. Cela peut conduire à des résultats inattendus si vous réaffectez l'une des variables avant que le thread ne commence à s'exécuter.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!