Python 使用多处理来绘制并保存在一张图中

Nai*_*ent 5 python matplotlib python-multiprocessing

我可以在同一张图中绘制单独的处理吗?例如下面的代码只能保存图中的最后一个图。

import matplotlib
matplotlib.use('agg')
from multiprocessing import Pool
import matplotlib.pyplot as plt
def f111(a,b,fig):
    plt.plot(a,b,'ro')
    plt.savefig('test.jpg')

if __name__=='__main__':
    fig=plt.figure(figsize=(20,10))
    p=Pool(8)
    for i in range(8):
        p.apply_async(f111,args=(1+i*6,6+i*6,fig))
    p.close()
    p.join()
Run Code Online (Sandbox Code Playgroud)

Mar*_*arc 0

我相信在这种情况下传递给 apply_async 的“fig”会成为一个副本,而不是指向最初创建的“fig”对象的指针,这里发生的情况是每个进程(从它自己的 Fig 副本)仅保存到 test.jpg它自己绘制的数据来自

plt.plot(a, b, 'ro')
Run Code Online (Sandbox Code Playgroud)

您看到的是最后完成的进程。

您是否必须在单独的流程中执行此操作?像这样简单的事情最好用一个简单的循环来绘制。

但是,如果您需要在池中进行大量计算,您可能希望将结果存储在 multiprocessing.Array 中,该数组允许您从所有子进程写入数据,并可以稍后在父进程中使用。通过这种方式,您可以在父进程中绘制单个图形,这很容易,但仍然具有快速并行计算的好处

import matplotlib
matplotlib.use('agg')
from multiprocessing import Pool, Array
import matplotlib.pyplot as plt


def f111(i, a, b, arr_a, arr_b):
    calc_value_a = a * 2
    calc_value_b = b * 2
    arr_a[i] = calc_value_a
    arr_b[i] = calc_value_b


if __name__=='__main__':
    fig=plt.figure(figsize=(20,10))
    arr_a = Array('i', range(8))
    arr_b = Array('i', range(8))
    p=Pool(8)
    for i in range(8):
        p.apply_async(f111, args=(i, 1+i*6, 6+i*6, arr_a, arr_b))
    p.close()
    p.join()
    plt.plot(arr_a, arr_b, 'ro') 
    plt.show()
Run Code Online (Sandbox Code Playgroud)