Coverage for src/ensae_teaching_cs/td_2a/parallel_thread.py: 97%
34 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
« prev ^ index » next coverage.py v7.1.0, created at 2023-04-28 06:23 +0200
1# -*- coding: utf-8 -*-
2"""
3Ce fichier contient un exemple qui permet d'exécuter plusieurs threads.
4"""
6import threading
7import time
10class ParallelThread(threading.Thread):
12 """
13 Cette classe implémente un thread qui exécute en boucle une fonction
14 sur tous les éléments d'une liste.
15 """
17 def __init__(self, f, list_of_params):
18 """
19 Constructeur
21 @param f fonction à exécuter
22 @param list_of_params liste des paramètres à exécuter
23 """
24 threading.Thread.__init__(self)
25 self.f2run = f
26 self.results = None
27 self.list_of_params = list_of_params
29 def run(self):
30 """
31 Appelle une fonction plusieurs sur tous les paramètres dans une liste.
32 """
33 self.results = []
34 for params in self.list_of_params:
35 l, p = (params, {}) if len(params) else params
36 self.results.append(self.f2run(*l, **p))
38 @staticmethod
39 def parallel(f, list_of_params, nbthread=2, wait=True,
40 daemon=True, delay_sec=1):
41 """
42 Parallélise l'appel à la fonction ``f``
43 sur une liste de paramètres.
45 @param f fonction à appeler sur chacun des paramètres de la liste
46 @param list_of_params liste des paramètres
47 @param nbthread nombre de threads
48 @param wait attendre pour la fin
49 @param daemon voir `daemon <https://docs.python.org/3/library/threading.html#threading.Thread.daemon>`_
50 @param delay_sec la fonction inclut une boucle qui attend les threads, elle vérifie cela toutes ``delay_sec`` secondes
51 """
52 th = []
53 split = [list_of_params[i::nbthread] for i in range(nbthread)]
54 for spl in split:
55 t = ParallelThread(f, spl)
56 t.daemon = daemon
57 th.append(t)
58 t.start()
60 if wait:
61 waits = th.copy()
62 while len(waits) > 0:
63 waits = [t_ for t_ in th if t_.is_alive()]
64 if len(waits) > 0:
65 time.sleep(delay_sec)
66 final = [None for i in range(len(list_of_params))]
67 for i in range(nbthread):
68 final[i::nbthread] = th[i].results
69 return final
70 return th