使用多处理保存多个matplotlib图形

时间:2014-07-21 13:16:02

标签: python matplotlib multiprocessing

我有一个代码,它从多个名为001.txt,002.txt,...,411.txt的文件中读取数据。我想从每个文件中读取数据,绘制它们,并保存为001.jpg,002.jpg,...,411.jpg。

我可以通过循环浏览文件来完成此操作,但我想使用多进程模块来加快速度。
但是,当我使用下面的代码时,计算机挂起 - 我无法点击任何东西,但鼠标移动,声音继续。然后我必须打开电脑的电源。

我显然在使用matplotlib来滥用多进程模块。我使用了与下面的代码非常相似的东西来实际生成数据,并保存到文本文件没有任何问题。我错过了什么?

    import multiprocessing

    def do_plot(number):
        fig = figure(number)

        a, b = random.sample(range(1,9999),1000), random.sample(range(1,9999),1000)
        # generate random data
        scatter(a, b)

        savefig("%03d" % (number,) + ".jpg")
        print "Done ", number
        close()



    for i in (0, 1, 2, 3):
        jobs = []
    #    for j in chunk:
        p = multiprocessing.Process(target = do_plot, args = (i,))
        jobs.append(p)
        p.start()
    p.join()

1 个答案:

答案 0 :(得分:3)

使用multiprocessing最重要的是仅为主进程运行模块的主代码。这可以通过测试if __name__ == '__main__'来实现,如下所示:

import matplotlib.pyplot as plt
import numpy.random as random
from multiprocessing import Pool


def do_plot(number):
    fig = plt.figure(number)

    a = random.sample(1000)
    b = random.sample(1000)

    # generate random data
    plt.scatter(a, b)

    plt.savefig("%03d.jpg" % (number,))
    plt.close()

    print("Done ", number)


if __name__ == '__main__':
    pool = Pool()
    pool.map(do_plot, range(4))

另请注意,我用流程池替换了单独流程的创建(它可以更好地扩展到许多图片,因为它只使用与可用内核一样多的流程)。