Matplotlib и: RuntimeError: основной поток не находится в основном цикле: - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь запустить несколько повторяющихся задач параллельно под python.Я довольно плохо знаком с многопроцессорностью, но, поскольку все задачи независимы, я использовал следующий простой фрагмент кода:

    import numpy as np
    import sys
    import os
    import glob
    import matplotlib.pyplot as plt
    import concurrent.futures as Cfut

    def analize(simul, N_thread):
        path = os.getcwd()

        print('Analizing topo ...')
        Data = output of some calculations

        print('Writing Data ...')
        np.save('Data', Data)

        print('Data saved')
        print('Printing figures')

        plt.figure()
        plt.plot(Data[0])
        plt.savefig('figure1.pdf)

        plt.clf()
        plt.plot(Data[0])
        plt.savefig('figure1.pdf)

        plt.close('all')
        print('figures saved')
        os.chdir(path

if __name__ == '__main__':
    list_simul = sorted(glob.glob('Layer*'))
    executor = Cfut.ProcessPoolExecutor(5)
   #executor = Cfut.ThreadPoolExecutor(N_jobs)
    futures = [executor.submit(analize, item, 10) for item in list_simul]
    Cfut.wait(futures)

Он работал очень хорошо в течение 3 месяцев, и с утра я иногда получаю следующееошибка:

Exception ignored in: <bound method Image.__del__ of <tkinter.PhotoImage object at 0x7fac6c187f98>>
    Traceback (most recent call last):
      File "/usr/lib/python3.5/tkinter/__init__.py", line 3359, in __del__
        self.tk.call('image', 'delete', self.name)
    RuntimeError: main thread is not in main loop

Странно, что некоторые работы выполняются без проблем, и это происходит не всегда.После небольшого исследования я нашел много постов с этой проблемой, все они были связаны с GUI.Я понял проблему, но я думаю, что я смогу найти обходной путь, так как я не показываю никакой фигуры, просто создаю объект и сохраняю его, и поскольку все задачи независимы.

Есть подсказка?

1 Ответ

0 голосов
/ 23 января 2019

Как видно здесь , вы пытались добавить следующий код в начало импорта?

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...