5

我在使用运行图形保存功能的 pathos 多处理时遇到了问题。

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 循环,pathosdataset_serial = map(model_handler, range(20))并行池执行没有问题,但如果我将串行映射对象转换为列表 ( print(list(dataset_serial))),并行池中的字形异常又回来了。

4

0 回答 0