Lors de la création de threads en Python, il est crucial de les invoquer explicitement en utilisant le start( ) méthode. Cependant, dans les situations où la fonction cible est invoquée dans la syntaxe de création de thread, un problème intrigant se pose.
Considérez l'extrait de code suivant :
t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
Étonnamment, la déclaration d'impression n'a jamais s'exécute car self.read s'exécute indéfiniment, empêchant le programme d'atteindre la ligne suivante. Ce comportement semble contre-intuitif, car l'appel de t1.start() devrait lancer l'exécution du thread et permettre au programme de continuer.
Le problème réside dans les parenthèses de fin après self.read(). En Python, les parenthèses qui suivent immédiatement une fonction l'invoquent, donc le code suivant :
target=self.read()
appelle en fait self.read et transmet sa valeur de retour comme argument cible à Thread. Cependant, Thread attend une référence de fonction, pas une valeur de retour. Pour corriger le comportement, supprimez simplement les parenthèses et invoquez explicitement t1.start() après la création du fil :
t1 = threading.Thread(target=self.read) t1.start() print("something")
Quand la fonction cible nécessite des arguments, utilisez les arguments args ou kwargs pour threading.Thread. Vous pouvez également utiliser une fonction lambda, comme indiqué ci-dessous :
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
ou
thread = threading.Thread(target=lambda: f(a, b, x=c))
N'oubliez pas que si vous utilisez un lambda, les arguments de la fonction sont évalués lorsque le lambda est invoqué, pas lorsque c'est défini. Cela peut conduire à des résultats inattendus si les variables sont réaffectées avant la planification des threads.
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!