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 :
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.
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