【问题标题】:matplotlib error when running plotting in multiprocess在多进程中运行绘图时出现 matplotlib 错误
【发布时间】:2017-11-23 18:34:24
【问题描述】:

我正在使用 python 的 Multiprocess.Pool 使用多个进程绘制一些数据,如下所示:

class plotDriver:
    def plot(self, parameterList):
        numberOfWorkers = len(parameterList)
        pool = Pool(numberOfWorkers)
        pool.map(plotWorkerFunction, parameterList)
        pool.close()
        pool.join()

这是我的类的简化版本,驱动程序还包含我选择省略的其他内容。 plotWorkderFunction 是一个单线程函数,它导入 matplotlib 并完成所有绘图和设置图形样式并将绘图保存到一个 pdf 文件中,每个工作人员不与另一个工作人员进行交互。

我需要多次调用这个绘图函数,因为我有很多参数列表,如下所示:

parameters = [parameterList0, parameterList1, ... parameterListn]
for param in parameters:
    driver = PlotDriver()
    driver.plot(param)

如果parameters 只包含一个parameterList(for 循环只运行一次),那么代码似乎工作正常。但只要parameters 包含多个元素,它就会始终失败,并在循环中第二次出现以下错误消息。

Traceback (most recent call last):
File "plot.py", line 59, in <module>
  plottingDriver.plot(outputFile_handle)
File "/home/yingryic/PlotDriver.py", line 69, in plot
  pool.map(plotWrapper, workerParamList)
File "/home/yingryic/.conda/envs/pp/lib/python2.7/multiprocessing/pool.py", line 251, in map
  return self.map_async(func.iterable, chunksize).get()
File "/home/yingryic/.conda/envs/pp/python2.7/multiprocessing/pool.py", line 567, in get
  raise self._value
RuntimeError: In set_text: could not load glyph
X Error: BadIDChoice (invalid resouce ID chosen for this connection) 14
  Extension: 138 (RENDER)
  Minor opcode: 17 (RenderCreateGlyphSet)
  Resouce id: 0xe00002
 : Fatal IO error: client killed

知道出了什么问题,我应该如何解决?

【问题讨论】:

  • 我得到了完全相同的错误。我的解决方法是捕捉这个异常,然后再试一次。通常它在第 2 次或第 3 次尝试时起作用,可能是不同的线程同时尝试加载字形。

标签: python matplotlib x11 multiprocess


【解决方案1】:

您可以尝试将import matplotlib 放入plotWorkerFunction(),以便子进程拥有自己的模块副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2022-10-23
    • 1970-01-01
    • 2020-12-27
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多