Maison  >  Article  >  développement back-end  >  Pourquoi mon thread s'exécute-t-il avant d'appeler « start() » en Python ?

Pourquoi mon thread s'exécute-t-il avant d'appeler « start() » en Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 04:00:03385parcourir

Why Does My Thread Run Before Calling `start()` in Python?

Exécution prématurée d'un thread sans appeler Start

En Python, la création d'un objet thread ne démarre pas automatiquement son exécution. Cependant, il est possible qu'un thread semble commencer à s'exécuter avant même que la méthode start() ne soit appelée. Ce comportement peut être attribué à une création incorrecte de thread et est expliqué ci-dessous.

Considérez l'extrait de code suivant :

t1 = threading.Thread(target=self.read)
print("something")
t2 = threading.Thread(target=self.runChecks(), args=(self,))

Dans cet exemple, la fonction self.read est destinée à s'exécuter indéfiniment, empêchant le programme d'atteindre l'instruction d'impression suivante. Cependant, le programme ignore complètement l'instruction print. Ce comportement semble anormal, car l'appel de start() sur un thread permet généralement à son exécution de commencer et de se dérouler de manière linéaire.

L'explication de ce problème réside dans la syntaxe utilisée pour créer le thread. Dans la première ligne, les parenthèses après self.read invoquent effectivement la fonction et attribuent sa valeur de retour comme cible du thread. Cela signifie que self.read s'exécute réellement dans le thread principal, et non dans le thread nouvellement créé.

Pour remédier à cela, supprimez simplement les parenthèses de l'argument cible :

t1 = threading.Thread(target=self.read)
t1.start()
print("something")

Cela garantit que self.read devient la fonction cible à exécuter par le thread et ne commence son exécution qu'après l'appel de t1.start().

Pour les cibles qui nécessitent des arguments, utilisez les paramètres args ou kwargs de threading.Thread ou utilisez une expression lambda. Par exemple :

thread = threading.Thread(target=lambda: f(a, b, x=c))

Cette syntaxe transmet la fonction et ses arguments au thread, garantissant une bonne exécution.

N'oubliez pas que les fonctions lambda évaluent leurs arguments lorsqu'elles sont utilisées, pas lorsqu'elles sont définies. Cela signifie que redéfinir les variables avant de planifier le thread peut conduire à des résultats inattendus.

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