Programmation Python/Les threads

Les threads Python sont utilisés pour lancer de multiples processus légers (tâches, appels de fonction) en même temps (mais cela ne veut pas forcément dire sur plusieurs processeurs). Les threads Python n'accélèreront donc pas un programme qui utilise déjà 100 % du temps d'un CPU (voir la programmation parallèle[1] pour cela).

Les threads Python sont utilisés si une tâche fait attendre les autres. C'est le cas par exemple, des interactions avec un serveur web, ou lors de l'utilisation de la fonction sleep.

Exemples modifier

Appel de fonction modifier

Pour afficher les nombres de 1 à 10, en attendant une seconde entre chaque :

#!/usr/bin/env python
# coding: utf-8
import threading
import time

def loop1_10():
    for i in range(1, 11):
        time.sleep(1)
        print(i)

threading.Thread(target=loop1_10).start()

Objet modifier

#!/usr/bin/env python
# coding: utf-8
import threading
import time
from __future__ import print_function

class MyThread(threading.Thread):
    def run(self):
        print("{} started!".format(self.getName()))           # affiche "Thread-x started!"
        time.sleep(1)                                         # simule un travail d'une seconde
        print("{} finished!".format(self.getName()))          # affiche "Thread-x finished!"

if __name__ == '__main__':
    for x in range(4):                                        # Quatre fois...
        mythread = MyThread(name = "Thread-{}".format(x + 1)) # ...Instancie un thread et lui donne un ID unique
        mythread.start()                                      # ...Démarre le thread
        time.sleep(.9)                                        # ...Attend 0,9 secondes avant d'en démarrer un autre

Résultat :

Thread-1 started!
Thread-2 started!
Thread-1 finished!
Thread-3 started!
Thread-2 finished!
Thread-4 started!
Thread-3 finished!
Thread-4 finished! 

Note : cet exemple diminue l'IDLE (temps d'inactivité) dans Windows XP, alors que cela fonctionne dans WING IDE, Netbeans, et Eclipse. Cela peut poser problème en remplaçant sleep(1) par (2), et range(4) par range(10). Le Thread-2 finit alors en première ligne (avant d'avoir commencé).

Références modifier