Я пытаюсь запустить несколько повторяющихся задач параллельно под 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.Я понял проблему, но я думаю, что я смогу найти обходной путь, так как я не показываю никакой фигуры, просто создаю объект и сохраняю его, и поскольку все задачи независимы.
Есть подсказка?