Bonjour à tous.

Dans le cadre d'une application que je développe avec Kivy, je dois à la fermeture de celle-ci générer plusieurs graph (entre 4 et 6) avec matplotlib. Problème : chaque graph peut avoir plusieurs dizaines voire centaines de milliers de points. J'essaye donc de les génerer en parrallèle grâce au mutlthreading.
Ce que j'ai fait jusqu'à maintenant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Thread_graph(Thread):
    """Permet le multi threading de generation de graph"""
    def __init__(self, chemin, y_low_min, y_low_max, y_high_min, y_high_max, format_graph):
        Thread.__init__(self)
        self.chemin = chemin
        self.y_low_min=y_low_min
        self.y_low_max=y_low_max
        self.y_high_min=y_high_min
        self.y_high_max=y_high_max
        self.format_graph=format_graph
 
    def run(self):
        """code à executer pendand l'executiond u thread"""
        genGraph.generer_graph(chemin=self.chemin, y_low_min=self.y_low_min, y_low_max=self.y_low_max, y_high_min=self.y_high_min, y_high_max=self.y_high_max, format_graph=self.format_graph)
Exécution :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 if(passerelle.graph1.flagGraph):
            t1=Thread_graph(chemin=chemin1, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
            t2=Thread_graph(chemin=chemin2, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
            t3=Thread_graph(chemin=chemin3, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
            t4=Thread_graph(chemin=chemin4, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
            try:
                t1.start()
                #genGraph.generer_graph(chemin=chemin1, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
 
            except AttributeError:
                Logger.warning('fermerBanc: impossible de generer un graph 1, fichier vide')
 
            try:
                t2.start()
                #genGraph.generer_graph(chemin=chemin2, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
 
            except AttributeError:
                Logger.warning('fermerBanc: impossible de generer un graph 2, fichier vide')
 
            try:
                t3.start()
                #genGraph.generer_graph(chemin=chemin3, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
 
            except AttributeError:
                Logger.warning('fermerBanc: impossible de generer un graph 3, fichier vide')
 
            try:
                t4.start()
                #genGraph.generer_graph(chemin=chemin4, y_low_min=passerelle.graph1.y_low_min, y_low_max=passerelle.graph1.y_low_max, y_high_min=passerelle.graph1.y_high_min, y_high_max=passerelle.graph1.y_high_max, format_graph=passerelle.graph1.setTaille)
 
            except AttributeError:
                Logger.warning('fermerBanc: impossible de generer un graph 4, fichier vide')
 
            t1.join()
            t2.join()
            t3.join()
            t4.join()
Ma fonction "generer_graph" genere un graph en .png.

Le problème c'est qu'à l'appel de ce code, j'obtiens l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[WARNING] [generer graph] chemin : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_1_2019-3-15-10-40-26.csv
[WARNING] [generer_graph] nom_graph : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_1_2019-3-15-10-40-26.png
[WARNING] [generer graph] chemin : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_2_2019-3-15-10-40-26.csv
[WARNING] [generer graph] chemin : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_3_2019-3-15-10-40-26.csv
[WARNING] [generer_graph] nom_graph : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_2_2019-3-15-10-40-26.png
[WARNING] [generer_graph] nom_graph : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_3_2019-3-15-10-40-26.png
[WARNING] [generer graph] chemin : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_4_2019-3-15-10-40-26.csv
[WARNING] [generer_graph] nom_graph : /media/pi/DATA8/2019-3-15-10-40-26/data_dut_4_2019-3-15-10-40-26.png
 Exception in thread Thread-4:
 Traceback (most recent call last):
 Exception in thread Thread-3:
   File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
 Traceback (most recent call last):
     self.run()
 Exception in thread Thread-6:
   File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
   File "interfacebancdetest_dev/main.py", line 217, in run
     self.run()
 Traceback (most recent call last):
     genGraph.generer_graph(chemin=self.chemin, y_low_min=self.y_low_min, y_low_max=self.y_low_max, y_high_min=self.y_high_min, y_high_max=self.y_high_max, format_graph=self.format_graph)
   File "interfacebancdetest_dev/main.py", line 217, in run
   File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
   File "/home/pi/Desktop/interfacebancdetest_dev/genGraph.py", line 48, in generer_graph
     genGraph.generer_graph(chemin=self.chemin, y_low_min=self.y_low_min, y_low_max=self.y_low_max, y_high_min=self.y_high_min, y_high_max=self.y_high_max, format_graph=self.format_graph)
     self.run()
     plt.plot(abcisse, ordonnee, marker=',')
   File "/home/pi/Desktop/interfacebancdetest_dev/genGraph.py", line 48, in generer_graph
   File "interfacebancdetest_dev/main.py", line 217, in run
     plt.plot(abcisse, ordonnee, marker=',')
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3092, in plot
     genGraph.generer_graph(chemin=self.chemin, y_low_min=self.y_low_min, y_low_max=self.y_low_max, y_high_min=self.y_high_min, y_high_max=self.y_high_max, format_graph=self.format_graph)
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3092, in plot
     ax = gca()
     ax = gca()
   File "/home/pi/Desktop/interfacebancdetest_dev/genGraph.py", line 48, in generer_graph
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 828, in gca
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 828, in gca
     ax =  gcf().gca(**kwargs)
     plt.plot(abcisse, ordonnee, marker=',')
     ax =  gcf().gca(**kwargs)
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1268, in gca
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3092, in plot
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1268, in gca
     return self.add_subplot(1, 1, 1, **kwargs)
     ax = gca()
     return self.add_subplot(1, 1, 1, **kwargs)
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 960, in add_subplot
   File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 828, in gca
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 960, in add_subplot
     self._axstack.add(key, a)
     ax =  gcf().gca(**kwargs)
     self._axstack.add(key, a)
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 124, in add
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1268, in gca
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 124, in add
     Stack.remove(self, (key, a_existing))
     return self.add_subplot(1, 1, 1, **kwargs)
     Stack.remove(self, (key, a_existing))
   File "/usr/lib/python2.7/dist-packages/matplotlib/cbook.py", line 1383, in remove
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 960, in add_subplot
   File "/usr/lib/python2.7/dist-packages/matplotlib/cbook.py", line 1383, in remove
     raise ValueError('Unknown element o')
     self._axstack.add(key, a)
     raise ValueError('Unknown element o')
 ValueError: Unknown element o
   File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 124, in add
 
 ValueError: Unknown element o
     Stack.remove(self, (key, a_existing))
 
   File "/usr/lib/python2.7/dist-packages/matplotlib/cbook.py", line 1383, in remove
     raise ValueError('Unknown element o')
 ValueError: Unknown element o
 
[INFO   ] [Base        ] Leaving application in progress...
Je pense qu'il s'agit d'un problème de ressources partagé, mais je ne saurais pas en dire plus...

Merci d'avance pour votre aide !