Python 将matplotlib包装到管道调用回主进程

Python 将matplotlib包装到管道调用回主进程,python,matplotlib,multiprocessing,Python,Matplotlib,Multiprocessing,动机我有一个现有的代码库,它由一个函数库组成,用于读取磁盘,主要使用numpy和scipy进行一些计算,然后绘制结果。此外,我还有一个用于进行元打印的函数,这意味着它接收一个文件列表和一个请求打印类型列表,并循环通过该列表生成pdf格式的打印网格 考虑到每个文件的计算是完全独立的,我希望使用多处理模块来获得即时的速度会相当容易。然而,毫不奇怪,生活似乎并没有那么简单 假例子 问题如何将matplotlib用于多处理?我正在寻找一种在调用matplotlib时完全透明的解决方案,例如plt.plo

动机我有一个现有的代码库,它由一个函数库组成,用于读取磁盘,主要使用numpy和scipy进行一些计算,然后绘制结果。此外,我还有一个用于进行元打印的函数,这意味着它接收一个文件列表和一个请求打印类型列表,并循环通过该列表生成pdf格式的打印网格

考虑到每个文件的计算是完全独立的,我希望使用多处理模块来获得即时的速度会相当容易。然而,毫不奇怪,生活似乎并没有那么简单

假例子

问题如何将matplotlib用于多处理?我正在寻找一种在调用matplotlib时完全透明的解决方案,例如plt.plot和plt.hold,但在启动过程时可能会很复杂。实际上,我希望能够在同一个图形中从多个进程绘制到不同的轴上。请注意,我实际上并不关心打印本身的并行化,我希望并行地执行文件读取和计算

可能的解决方案A我使用plt.pause0.0001和plt.close取得了一些成功,这是毫无意义的,但确实证明了您确实可以从多个进程中同时生成图形,并且可以分别保存每个进程。也许这是最明智的解决方案,但令人烦恼的是,我不知道如何使用它来生成pdf中的网格图。除非在最后进行一些奇特的pdf合并

可能的解决方案B我想知道是否可以包装matplotlib,以便将所有函数调用通过管道传回主进程。我想,如果有一个pipedMPL函数包装器,它将应用于映射异步的第一个参数,那么这将是可行的。主进程将接收打印命令并将其发送到相关轴。它应该知道源进程,以便选择正确的轴。我觉得这可能是一个很好的解决方案,但我希望编写正确处理实例方法和所有内容所需的包装器会相当复杂。问:就可能的困难和对其他人的有用性而言,这是否值得追求,或者已经有更好的解决方案了,还有类似模块包装的例子吗?注意,这不是一个或两个方法的基本猴子修补,我想为所有方法编写一个通用包装器

可能的解决方案C我简单地看了一下在子流程上产生的轴是否可以酸洗,然后将其发送回主流程,以便在主图形中使用。也许这是可能的,但我无法使其工作。我只是得到了酸洗错误

还有其他想法吗

更新

经过几个小时的工作,我得到了解决方案B工作的基本版本:

就轻松包装模块而言,它实际上非常简单,如状态:

from multiprocessing import Pool
import matplotlib.pylab as plt
from numpy.random import random
from time import sleep

def computeAndPlot(a):
    sleep(2) # pretend we're working hard
    plt.imshow(random((10,10))) # plot the "result"

if __name__== "__main__":
    Pool().map_async(computeAndPlot,[(ii,) for ii in xrange(40)]).get()
import sys
sys.module['matplotlib'] = MyFakeMatplotlib()