Les deamon threads en Python

Par : Géry Menye, le 10 Juillet 2022

Dans ce tutoriel, vous apprendrez ce que sont les daemon threads en Python et comment les configurer. Vous devez avoir une connaissance de base des threads pour suivre ce tutoriel.

Un daemon thread est un thread qui meurt lorsque le thread principal meurt, il est également appelé un thread non-bloquant (non-blocking thread). Habituellement, le thread principal doit attendre que les autres threads se terminent pour quitter le programme, mais si vous définissez l'indicateur daemon, vous pouvez laisser le thread faire son travail et l'oublier, et lorsque le programme se termine, il sera détruit automatiquement.

Les daemon threads sont utiles dans de nombreux scénarios. Supposons que vous effectuez des tâches de web scraping et que vous souhaitiez créer un thread qui vous alerte par e-mail chaque fois qu'un nouvel élément est inséré dans le site web particulier que vous scrapez.

Un autre exemple est celui d'un thread qui surveille les fichiers journaux de votre programme et vous alerte lorsqu'une erreur critique se produit.

 

Maintenant que vous savez ce qu'est un daemon thread, et que vous savez qu'il est utile, prenons un exemple de démonstration, le code suivant initie un thread non-daemon et le démarre, puis nous terminons également le thread principal :

import time
import threading

def func():
    while True:
        print(f"[{threading.current_thread().name}] Printing this message every 2 seconds")
        time.sleep(2)

# initiate the thread to call the above function
normal_thread = threading.Thread(target=func, name="normal_thread")
# start the thread
normal_thread.start()
# sleep for 4 seconds and end the main thread
time.sleep(4)
# the main thread ends

La fonction func() devrait s'exécuter à l'infini, puisque nous définissons True comme condition de la boucle while. Après avoir lancé ce thread, nous faisons une simple pause de 4 secondes dans le thread principal et quittons le programme.

Cependant, si vous l'exécutez, vous verrez que le programme continue de tourner et ne vous permet pas de sortir (seulement si vous fermez la fenêtre) :

[normal_thread] Printing this message every 2 seconds
[normal_thread] Printing this message every 2 seconds
[normal_thread] Printing this message every 2 seconds
[normal_thread] Printing this message every 2 seconds
[normal_thread] Printing this message every 2 seconds
...goes forever

Ainsi, le non-daemon thread fait en sorte que le programme refuse de sortir tant qu'il n'est pas terminé.

L'exemple suivant lance cette fois un daemon thread:

import time
import threading

def func_1():
    while True:
        print(f"[{threading.current_thread().name}] Printing this message every 2 seconds")
        time.sleep(2)

# initiate the thread with daemon set to True
daemon_thread = threading.Thread(target=func_1, name="daemon-thread", daemon=True)
# or
# daemon_thread.daemon = True
# or
# daemon_thread.setDaemon(True)
daemon_thread.start()
# sleep for 10 seconds and end the main thread
time.sleep(4)
# the main thread ends

Maintenant, nous passons daemon=True à la classe threading.Thread pour indiquer qu'il s'agit d'un daemon thread, vous pouvez également faire passer l'attribut daemon à True ou utiliser la méthode setDaemon(True).

Exécutons le programme :

[daemon-thread] Printing this message every 2 seconds
[daemon-thread] Printing this message every 2 seconds

Cette fois, une fois que le thread principal a terminé son travail, le daemon thread est également détruit automatiquement et quitte le programme.