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