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
modifierAppel de fonction
modifierPour 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é).