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

Linda Hamilton
Libérer: 2024-11-09 15:48:02
original
277 Les gens l'ont consulté

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,))
Copier après la connexion

É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()
Copier après la connexion

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")
Copier après la connexion

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})
Copier après la connexion

ou

thread = threading.Thread(target=lambda: f(a, b, x=c))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal