"не удалось загрузить глиф" в многопроцессорной среде - PullRequest
0 голосов
/ 25 сентября 2018

У меня проблема с использованием многопроцессорной обработки пафоса, которая запускает функцию сохранения фигуры.

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))), глифВозникает исключение в параллельном пуле.

...