Python - Création d'un Thread

Bonjour, aspirants programmeurs Python ! Aujourd'hui, nous allons plonger dans le monde passionnant des threads. Ne vous inquiétez pas si vous n'avez jamais entendu parler de threads avant – nous commencerons par les bases et nous nous dirigerons vers des concepts plus avancés. À la fin de ce tutoriel, vous créerez des threads comme un pro !

Python - Creating a Thread

Qu'est-ce qu'un Thread ?

Avant de nous lancer dans la création de threads, voyons ce qu'ils sont. Imaginez que vous cuisinez un plat complexe. Vous ne faites pas tout les uns après les autres – vous pouvez avoir des pâtes qui bouillissent sur un brûleur tout en coupant des légumes sur le plan de coupe. C'est un peu ce que font les threads en programmation. Ils permettent à différents parties de votre programme de s'exécuter concurremment, rendant votre code plus efficace.

Création de Threads avec des Fonctions

La manière la plus simple de créer un thread en Python est d'utiliser une fonction. Commençons par un exemple de base :

import threading
import time

def print_numbers():
for i in range(5):
print(f"Nombre {i}")
time.sleep(1)

# Créer un thread
thread = threading.Thread(target=print_numbers)

# Démarrer le thread
thread.start()

print("Le thread principal continue à s'exécuter")

# Attendre que le thread se termine
thread.join()

print("Le thread a terminé")

Analysons cela :

  1. Nous importons le module threading, qui fournit les outils dont nous avons besoin pour travailler avec les threads.
  2. Nous définissons une fonction simple print_numbers() qui imprime des nombres de 0 à 4, avec une pause de 1 seconde entre chaque impression.
  3. Nous créons un thread en utilisant threading.Thread(), en spécifiant notre fonction comme target.
  4. Nous démarrons le thread avec thread.start().
  5. Le programme principal continue à s'exécuter, imprimant "Le thread principal continue à s'exécuter".
  6. Nous utilisons thread.join() pour attendre que notre thread se termine avant de passer à la suite.

Lorsque vous exécutez cela, vous verrez que "Le thread principal continue à s'exécuter" est imprimé immédiatement, tandis que les nombres sont imprimés en arrière-plan. C'est le pouvoir des threads !

Création de Threads en Étendant la Classe Thread

Une autre manière de créer des threads est d'étendre la classe Thread. Cette méthode est utile lorsque vous souhaitez créer un objet thread réutilisable. Voici un exemple :

import threading
import time

class NumberPrinter(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name

def run(self):
for i in range(5):
print(f"{self.name} : Nombre {i}")
time.sleep(1)

# Créer deux threads
thread1 = NumberPrinter("Thread 1")
thread2 = NumberPrinter("Thread 2")

# Démarrer les threads
thread1.start()
thread2.start()

print("Le thread principal continue à s'exécuter")

# Attendre que les deux threads se terminent
thread1.join()
thread2.join()

print("Les deux threads ont terminé")

Dans cet exemple :

  1. Nous définissons une classe NumberPrinter qui étend threading.Thread.
  2. Nous redéfinissons la méthode __init__ pour accepter un nom pour notre thread.
  3. Nous redéfinissons la méthode run, qui est appelée lorsque le thread démarre.
  4. Nous créons deux instances de notre classe NumberPrinter et les démarrons.
  5. Les deux threads s'exécutent concurremment, imprimant leurs nombres.

Cette méthode nous donne plus de contrôle sur nos threads et nous permet de créer plusieurs instances facilement.

Création de Threads en Utilisant la Fonction start_new_thread()

Il y a une troisième manière de créer des threads en Python, en utilisant la fonction start_new_thread() du module _thread. Cependant, cette méthode est considérée comme de bas niveau et n'est pas recommandée pour la plupart des cas d'utilisation. Voici un exemple pour la complétude :

import _thread
import time

def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name} : Nombre {i}")
time.sleep(1)

# Démarrer deux nouveaux threads
try:
_thread.start_new_thread(print_numbers, ("Thread 1",))
_thread.start_new_thread(print_numbers, ("Thread 2",))
except:
print("Erreur : impossible de démarrer le thread")

# Maintenir le thread principal en vie
time.sleep(6)
print("Le thread principal quitte")

Cette méthode est moins flexible et ne fournit pas autant de contrôle que les méthodes précédentes. Il est également plus difficile d'attendre la fin des threads avec cette approche.

Comparaison des Méthodes de Création de Threads

Voici une comparaison rapide des trois méthodes que nous avons discutées :

Méthode Avantages Inconvénients
Utilisation de Fonctions Simple à implémenter, adapté aux tâches ponctuelles Moins réutilisable, contrôle limité
Étendre la Classe Thread Réutilisable, plus de contrôle, orienté objet Un peu plus complexe à configurer
start_new_thread() Contrôle de bas niveau Plus difficile à gérer, moins flexible, non recommandé

Conclusion

Félicitations ! Vous avez juste pris vos premiers pas dans le monde des threads en Python. Nous avons couvert trois différentes manières de créer des threads, chacune ayant ses propres avantages et cas d'utilisation. Rappelez-vous, les threads peuvent rendre vos programmes plus efficaces, mais ils introduisent également une complexité. À mesure que vous continuez votre voyage en Python, vous apprendrez plus sur quand et comment utiliser efficacement les threads.

Continuez à pratiquer, et bientôt vous utiliserez les threads comme un programmeur chevronné. Bon codage !

Credits: Image by storyset