Даск задержан + Matplotlib.savefig () -> FAIL

Моя цель - создать несколько файлов png из нескольких массивов numpy, загруженных из медицинских изображений на моем HD. Чтобы ускорить процесс, я использую dask delayed. Вот мой рабочий код:

import os.path
from glob import glob

import nibabel as nib
import numpy as np
from dask import delayed

def process(data):
    # Need to have the import inside so that multiprocessing works.
    # Apparently doesn't solve the issue anyway..
    import matplotlib.pyplot as plt
    outpath = '/Users/user/outputdir/'
    name = os.path.basename(data.get_filename())
    savename = name[:name.index('.')] + '.png'

    plt.imshow(np.rot90(data.get_data()[15:74, 6:82, 18, 0]),
               extent=[0, 1, 0, 1], aspect=1.28, cmap='gray')
    plt.axis('off')
    out = os.path.join(outpath, savename)
    plt.savefig(out)
    plt.close()
    return out


L = []
for fn in glob("/Users/user/imagefiles/mb*.nii.gz"):
    nifti = delayed(nib.load)(fn)
    outpng = delayed(process)(nifti)
    L.append(outpng)

results = delayed(print)(L)
results.compute()

Моя проблема в том, что после каждого запуска некоторые из выходных изображений пусты (ничего в png), и какие изображения пусты, кажутся довольно случайными, поскольку все входные данные действительны.

Я подозреваю, что это проблема многопроцессорности и matplotlib, как показано в другая связанная тема.

У кого-нибудь есть предложения о том, как заставить это работать с dask?

EDIT: минимальный рабочий пример

import os.path
import random
import string

import numpy as np
from dask import delayed

def gendata(fn):
    return

def process(data):
    # Need to have the import inside so that multiprocessing works.
    import matplotlib.pyplot as plt

    outpath = '/Users/user/Pictures/test/'
    name = ''.join(random.choices(string.ascii_lowercase, k=10))
    savename = name + '.png'

    data = np.random.randint(0, 255, size=(100,100,20,2))

    plt.imshow(np.rot90(data[15:74, 6:82, 18, 0]),
               extent=[0, 1, 0, 1], aspect=1.28, cmap='gray')
    plt.axis('off')
    out = os.path.join(outpath, savename)
    plt.savefig(out)
    plt.close()
    return out

L = []
for fn in range(0, 10):
    nifti = delayed(gendata)(fn)
    outpng = delayed(process)(nifti)
    L.append(outpng)

results = delayed(print)(L)
results.compute()

person dangom    schedule 24.05.2017    source источник
comment
Это относится к используемым данным или вы могли бы предоставить минимальный воспроизводимый пример?   -  person ImportanceOfBeingErnest    schedule 24.05.2017
comment
@ImportanceOfBeingErnest извините за это. Просто добавил один. Код также отлично работает, если я удаляю вызовы с задержкой и просто запускаю все последовательно.   -  person dangom    schedule 24.05.2017
comment
Предлагаю поднять это на Dask [система отслеживания проблем]( github.com/dask/dask/issues ) со ссылкой на этот пост. Также рекомендуется добавить метки dask и dask-delayed выше.   -  person jakirkham    schedule 10.06.2017