многопоточный граф matplotlib в приложении киви - PullRequest
0 голосов
/ 15 марта 2019

Я хочу создать несколько графиков, используя matplotlib, когда я покидаю свое приложение kivy.

Проблема

Создание 4-6 графиков в .png занимает много времени (в моем случае около 1 или 2 минут), поэтому я хотел многопоточность своего процесса, но он не работал (ошибка исключения приведена ниже ...)

[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...

Насколько я понимаю, это может быть проблемой общих ресурсов между разными потоками, но я не знаю, как решить эту проблему ...

Мой код:

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

Мой класс

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)

1 Ответ

0 голосов
/ 20 марта 2019

Обнаружено, что из-за внутренних условий matplotlib не является "потокобезопасным".Вместо этого я использовал процесс (и так как моему фону требовалось несколько аргументов, мне пришлось изменить его, чтобы вместо него передать список объектов)

process doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...