Python - INTERRUPTION D'UN FIL

Bonjour, aspirants programmeurs Python ! Aujourd'hui, nous allons plonger dans un sujet passionnant : l'interruption des fils en Python. Ne vous inquiétez pas si vous êtes nouveau dans la programmation ; je vais vous guider étape par étape, tout comme j'ai fait pour d'innombrables étudiants au fil des années. Embarquons ensemble dans cette aventure !

Python - Interrupting a Thread

Qu'est-ce qu'un Fil ?

Avant de nous lancer dans l'interruption des fils, rappelons rapidement ce qu'est un fil. Imaginez que vous lisez un livre (le programme principal) et que vous vous souvenez soudain que vous devez passer un appel téléphonique. Vous marquez votre page (créez un fil), passez l'appel, puis retournez à votre livre. C'est ainsi que les fils fonctionnent en programmation – ils permettent à un programme de faire plusieurs choses à la fois.

Interruption des Fils

Maintenant, supposons que vous êtes en train de passer cet appel, mais que cela prend trop de temps et que vous voulez retourner à votre livre. Comment terminez-vous l'appel poliment ? C'est là que l'interruption des fils entre en jeu. En Python, nous avons plusieurs moyens de le faire :

  1. Utiliser un objet Événement
  2. Utiliser un Drapeau

Explorons les deux méthodes avec quelques exemples amusants !

Interruption des Fils Utilisant un Objet Événement

L'objet Événement est comme un drapeau qui peut être positionné ou effacé. Lorsque le drapeau est positionné, il signale au fil de s'arrêter.

Voici un exemple simple :

import threading
import time

def travailleur(event):
while not event.is_set():
print("Travaillant...")
time.sleep(1)
print("Travailleur : Je suis terminé !")

# Créer un objet événement
stop_event = threading.Event()

# Créer et démarrer le fil
fil = threading.Thread(target=travailleur, args=(stop_event,))
fil.start()

# Laisser le fil s'exécuter pendant 5 secondes
time.sleep(5)

# Positionner l'événement pour signaler au fil de s'arrêter
stop_event.set()

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

print("Principal : Tout est terminé !")

Analysons ce code :

  1. Nous importons les modules nécessaires : threading pour travailler avec les fils, et time pour ajouter des délais.
  2. Nous définissons une fonction travailleur qui continue de travailler jusqu'à ce que l'événement soit positionné.
  3. Nous créons un objet Event appelé stop_event.
  4. Nous créons et démarrons un fil, en passant le stop_event.
  5. Nous laissons le fil s'exécuter pendant 5 secondes en utilisant time.sleep(5).
  6. Nous positionnons l'événement avec stop_event.set(), ce qui signale au fil de s'arrêter.
  7. Nous attendons que le fil se termine avec fil.join().

Lorsque vous exécutez cela, vous verrez "Travaillant..." imprimé plusieurs fois, puis "Travailleur : Je suis terminé !" suivi de "Principal : Tout est terminé !".

Interruption des Fils Utilisant un Drapeau

Une autre manière d'interruption un fil est d'utiliser un simple drapeau booléen. Cette méthode est un peu plus manuelle mais peut être très efficace.

Voici un exemple :

import threading
import time

def compter_moutons(stop_flag):
count = 0
while not stop_flag[0]:
count += 1
print(f"Compter les moutons : {count}")
time.sleep(1)
print(f"J'ai compté {count} moutons avant de m'endormir !")

# Créer un objet mutable pour contenir notre drapeau
stop_flag = [False]

# Créer et démarrer le fil
fil = threading.Thread(target=compter_moutons, args=(stop_flag,))
fil.start()

# Laisser le fil compter les moutons pendant 5 secondes
time.sleep(5)

# Définir le drapeau à True pour arrêter le fil
stop_flag[0] = True

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

print("Principal : Doux rêves !")

Analysons ce code :

  1. Nous définissons une fonction compter_moutons qui compte jusqu'à ce que le stop_flag soit défini à True.
  2. Nous créons une liste stop_flag avec un seul élément booléen. Nous utilisons une liste car elle est mutable, ce qui nous permet de la modifier de l'extérieur du fil.
  3. Nous créons et démarrons un fil, en passant le stop_flag.
  4. Nous laissons le fil compter les moutons pendant 5 secondes.
  5. Nous définissons stop_flag[0] à True, ce qui signale au fil de s'arrêter.
  6. Nous attendons que le fil se termine avec fil.join().

Lorsque vous exécutez cela, vous verrez le comptage de moutons augmenter pendant environ 5 secondes, puis le comptage final, suivi de "Principal : Doux rêves !".

Comparaison des Méthodes

Comparons ces deux méthodes :

Méthode Avantages Inconvénients
Objet Événement - Synchronisation intégrée
- Clair et pythonique
- Nécessite de passer l'objet événement
Drapeau - Simple à implémenter
- N'a pas besoin d'objets supplémentaires
- Synchronisation manuelle
- Possibilité de conditions de course

Conclusion

Félicitations ! Vous avez juste appris deux manières d'interruption des fils en Python. La méthode de l'objet Événement est généralement préférée pour sa synchronisation intégrée, mais la méthode du drapeau peut être utile dans des scénarios plus simples.

N'oubliez pas, tout comme terminer poliment un appel téléphonique, il est important de donner à vos fils une chance de nettoyer avant de s'arrêter. Dans les applications du monde réel, vous pourriez vouloir ajouter du code de nettoyage dans votre fonction de fil qui s'exécute lorsque le signal d'arrêt est reçu.

La programmation, c'est avant tout de la pratique, alors j'encourage à expérimenter avec ces exemples. Essayez de les modifier, peut-être en ajoutant plusieurs fils ou en changeant le timing. Qui sait ? Vous pourriez créer un jeu amusant de "interruption du compteur de moutons" !

Bon codage, et que vos fils coopèrent toujours !

Credits: Image by storyset