1
0
Bifurcation 0
miroir de https://github.com/PAPAMICA/Wiki-Tech.io.git synchronisé 2024-11-27 11:41:14 +01:00
Wiki-Tech.io/Scripting/Python/threading.md
2022-10-11 09:37:16 +00:00

2,8 Kio

title description published date tags editor dateCreated
Threading Paralléliser les opérations true 2022-10-11T09:37:14.419Z markdown 2022-10-11T09:10:42.435Z

Fichier:Python logo and wordmark.svg — Wikipédia

Threading

Exécuter plusiuers fonctions en même temps

Certaines fonctions d'un programme peuvent prendre du temps à s'exécuter. Cependant, vous ne souhaitez pas forcément que tout le programme s'arrête pour cette fonction. Pour une interface graphique par exemple ! Si une action requiert un certain temps, vous ne souhaiterez certainement pas planter toute l'interface. C'est là que le multi-threading intervient.

Prenons l'exemple suivant :

def wait(duration):
    time.sleep(duration)
    print("j'ai attendu")

def hello():
    print("Hello")

wait(5)
hello()

>>> j'ai attendu
>>> Hello

Dans ce cas, on doit attendre que la fonction "wait" ait terminé son exécution pour passer à la suite. On va donc créer des threads :

import threading
import time

def wait(duration):
    time.sleep(duration)
    print("j'ai attendu")

def hello():
    print("Hello")

wait = threading.Thread(target=wait, args=(2,))
hello = threading.Thread(target=hello)

wait.start()
hello.start()

>>> Hello
>>> j'ai attendu

Ici, on voit que la fonction "hello" n'a pas attendu la fin de "wait" pour se lancer. Pour créer le thread, on appelle la fonction Thread de la library threading (en l'affectant à une variable) avec les arguments suivants :

  • target : le nom de la fonction à exécuter
  • args (optionnel) : si la fonction a besoin d'arguments, on les donne ici Ensuite, on lance le thread avec la fonciton start

Attention : J'attire votre attention sur la virgule après le 2 dans les args. En effet, un tuple est attendu. Si vous n'avez qu'un seul argument à donner, il faut donc mettre une virgule pour indiquer qu'il s'agit d'un tuple. {.is-warning}

Attendre la fin de l'exécution d'un thread

Si vous ne voulez pas bloquer tout le programme pour une fonciton, il peut tout de même y avoir des dépendances. Il faudra donc préciser que le thread doit être terminé avant de continuer le script à l'aide de la fonction join. Dans cet exemple, la fonction end doit être executée en dernier. On indique alors que les threads doivent avoir terminé leur exécution :

import threading
import time

def wait(duration):
    time.sleep(duration)
    print("j'ai attendu")

def hello():
    print("Hello")
    
def end():
    print("execution terminée")

wait = threading.Thread(target=wait, args=(2,))
hello = threading.Thread(target=hello)

wait.start()
hello.start()

wait.join()
print_stg.join()

end()

>>> Hello
>>> j'ai attendu
>>> execution terminée