Python
multiprocessing
matplotlib

Matplotlibをmultiprocessing.Poolで並列化する際の覚書

背景

  • Matplotlibをmultiprocessing.Poolで並列化すると画像が乱れることがあった
  • 問題なく描画できることも多かったので発生条件の絞り込みに時間がかかった

 4.png
↑カラーバーの目盛に注目

問題の再現、現状分かっていること

  • Poolで分岐する前にpyplotを呼んでいる場合のみ、画像の乱れが生じた
  • 以下のプログラムでto_failフラグをFalseにすると正しく描画できる
#!/bin/python3

import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from multiprocessing import Pool

def myplot(x):
    np.random.seed(10 ** 6 * x)
    data = np.random.randn(10, 10)
    plt.imshow(data)
    plt.colorbar()
    plt.savefig("img/%02s.png" % x)
    plt.close()

def multi(n, to_fail):
    if to_fail:
        myplot(999)
    with Pool(4) as p:
        p.map(myplot, range(n))

multi(10, to_fail=True)

対策

  • 上手くいくこともあるが、matplotlibは安易に並列化しないほうが良さそうだ