Matplotlib和:RuntimeError:主线程不在主循环中:

时间:2018-10-16 16:11:40

标签: python multithreading matplotlib tkinter multiprocessing

我正在尝试在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有关。我理解了这个问题,但是我想我应该能够找到一种解决方法,因为我没有显示任何图形,只是创建对象并保存它,并且所有任务都是独立的。

有任何提示吗?

2 个答案:

答案 0 :(得分:3)

matplotlib 默认使用 TkAggTkAggFltkAggGTKGTKAggGTKCairoWxWxAgg 等后端都是基于 GUI 的。并且大多数 GUI 后端需要从主线程运行。因此,如果您在没有 GUI 的环境中运行,它会抛出 RuntimeError: main thread is not in main loop

因此,只需切换到不使用 GUI 的后端:AggCairoPSPDFSVG

例如:

import matplotlib.pyplot as plt
plt.switch_backend('agg')

参考文献:https://matplotlib.org/stable/faq/howto_faq.html#work-with-threads

答案 1 :(得分:1)

here所示,您是否尝试过将以下代码添加到导入的顶部?

import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';

@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {

 constructor() { }

 ngOnInit() {
 }
 }