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
Libérer: 2024-11-10 08:11:02
original
700 Les gens l'ont consulté

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

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

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!

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