Maison >développement back-end >Tutoriel Python >Pourquoi l'exécution de mon thread est-elle anormale lorsque je n'invoque pas explicitement les threads en Python ?

Pourquoi l'exécution de mon thread est-elle anormale lorsque je n'invoque pas explicitement les threads en Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-09 15:48:02310parcourir

Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?

Anomalies d'exécution des threads : démystifier l'invocation prématurée de threads

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.

Le problème : exécuter des threads sans invocation explicite

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.

La solution : comprendre l'idée fausse des parenthèses

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")

Gestion des arguments dans les cibles du fil

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn