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

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 08:11:02674parcourir

Why Does My Thread Run Before Calling `Thread.start()` in 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!

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