我正在使用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文件中,并且每个工作程序不与另一个工作程序交互。
我需要多次调用这个plot函数,因为我有很多parameterList,如下所示:
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
知道出了什么问题以及我该如何解决?
答案 0 :(得分:1)
您可以尝试将import matplotlib
放入plotWorkerFunction()
中,以使子进程拥有自己的模块副本。