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-01-27 05:44 +0100

1# -*- coding: utf-8 -*- 

2""" 

3Ce fichier contient un exemple qui permet d'exécuter plusieurs threads. 

4""" 

5 

6import threading 

7import time 

8 

9 

10class ParallelThread(threading.Thread): 

11 

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 """ 

16 

17 def __init__(self, f, list_of_params): 

18 """ 

19 Constructeur 

20 

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 

28 

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)) 

37 

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. 

44 

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() 

59 

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