У меня проблема с использованием многопроцессорной обработки пафоса, которая запускает функцию сохранения фигуры.
from pathos.multiprocessing import ProcessingPool as Pool
datasets = Pool().map(model_handler, analysisParams)
, которая выдает
File ".../lib/python3.6/site-packages/matplotlib/backends/backend_pdf.py", line 2029, in draw_text
font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
RuntimeError: In set_text: could not load glyph
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "wrapper.py", line 410, in <module>
datasets = Pool().map(model_handler, analysisParams)
File ".../lib/python3.6/site-packages/pathos/multiprocessing.py", line 137, in map
return _pool.map(star(f), zip(*args)) # chunksize
File ".../lib/python3.6/site-packages/multiprocess/pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File ".../lib/python3.6/site-packages/multiprocess/pool.py", line 608, in get
raise self._value
RuntimeError: In set_text: could not load glyph
"""
В настоящее время я понимаю, что это происходит потому, что глифвызывается одновременно несколькими процессами.Исключение происходит только тогда, когда число параллельных выполнений достигает> 3, что согласуется с этой идеей.Я вижу, что работа одного человека вокруг состояла в том, чтобы просто вызывать savefig несколько раз, пока команда не прошла, но распараллеленная функция содержит тонну графиков, и я бы не хотел заключать каждый из них в оператор try.У кого-нибудь есть идеи о том, как избежать этого исключения при параллельном построении фигур?Спасибо !!
РЕДАКТИРОВАТЬ Минимальный пример для запроса комментария.
from pathos.multiprocessing import ProcessingPool as Pool
def model_handler(analysisParam):
import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt
figout = plt.figure(figsize=(1, 1))
axes = figout.add_subplot(1,1,1)
axes.scatter(range(1000), range(1000))
figout.savefig('dummyfig{}.pdf'.format(analysisParam), format='pdf')
return analysisParam
datasets_serial = []
for j in range(20):
datasets_serial.append(model_handler(j))
datasets = Pool(20).map(model_handler, range(20))
Интересно, что если я заменю цикл dataset_serial на dataset_serial = map(model_handler, range(20))
, параллельный пул пафоса выполняется без проблем, но если я преобразую объект последовательной карты в список (print(list(dataset_serial))
), глифВозникает исключение в параллельном пуле.