IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Generer des graphes avec matplotlib en multithreading


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut Generer des graphes avec matplotlib en multithreading
    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 !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par StanSmooth Voir le message
    Je pense qu'il s'agit d'un problème de ressources partagé, mais je ne saurais pas en dire plus...
    Un peu de recherche sur Internet vous indiquerait que matplotlib n'est pas "thread-safe" parce que les backends (les bibliothèques graphiques) ne sont pas thread-safe.
    A partir de là, il va falloir trouver autre chose... et là encore, un peu de recherche sur Internet pour savoir ce qu'ont fait ceux qui ont été confrontés à ce genre de pbs et voir si vous pouvez intégrer ces solutions...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    Bonjour Wiztricks,
    Merci pour votre réponse constructive.
    Les recherches que j'avaient effectué m'ont conduit à l'utilisation de multiprocess. Malheureusement, c'est un procédé, que je connais mal (notamment pour pouvoir faire passer plusieurs arguments dans un process), et j'aurais aimé pouvoir utiliser du multithreading. Après si c'est impossible, je vais me rabattre sur le multiprocessing.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    A partir de Python 2.6, le module "multiprocessing" a été rendu proche dans sa syntaxe du multithreading, ce qui facilite grandement son utilisation. Et il a l'avantage de permettre l'utilisation simultanée des cœurs des CPU actuels, contrairement au multithreading.

    => https://docs.python.org/2/library/mu...ultiprocessing

    Pour la question posée, il faudrait garder tout ce qui est graphique dans la partie principale du programme, et faire les calculs longs en multiprocessing.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par StanSmooth Voir le message
    Malheureusement, c'est un procédé, que je connais mal (notamment pour pouvoir faire passer plusieurs arguments dans un process), et j'aurais aimé pouvoir utiliser du multithreading. Après si c'est impossible, je vais me rabattre sur le multiprocessing.
    De toutes façons, plusieurs threads en Python ne vous permettront pas d'utiliser plus de ressources que celles d'un seul CPU. Pour aller plus vite dans des calculs, vous n'avez pas trop le choix.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 53
    Par défaut
    J'ai finalement opté pour du multiprocessing, et les resultats semblent s'être amélioré, merci à tous

Discussions similaires

  1. Generer des graphes avec GWT
    Par nanson dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 15/07/2009, 10h52
  2. Generer des graphes à partir de données contenue dans un serveur
    Par Premium dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 09/05/2007, 17h31
  3. Problème d'affichage des graphes avec Tomcat
    Par _Janu_ dans le forum BIRT
    Réponses: 11
    Dernier message: 20/09/2006, 15h30
  4. Generer des pdf avec Birt
    Par soumou dans le forum BIRT
    Réponses: 1
    Dernier message: 07/09/2006, 09h56
  5. tracer des graphes avec php
    Par estampille dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2006, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo