Порядок обратных выводов в многопроцессорном python starmap pool - PullRequest
0 голосов
/ 27 сентября 2019

У меня на диске четыре файла.Эти четыре файла в формате .npz.Я написал starmap pool многопроцессорную Python-программу, которая будет использовать 4 процессора, каждый из которых будет загружать данные из отдельных .npz файлов в моем каталоге и возвращать данные в 4 списках.

Вот разбивка кода иЯ получаю желаемый результат с этим.Мой единственный вопрос - понять порядок, в котором этот результат получен.

save_list_in  # A list which contains the address and names of the four .npz files to be               

file_name_1   # A a sub-string which is to be found in the items of save_list_in

Теперь вот функция, которая должна выполняться параллельно.

def save (file_in, file_name_1, file_name_2):
    sample_1_seq = []
    sample_1_embed = []
    sample_2_embed = []
    sample_2_seq = []

    if file_name_1+"_seq"  in file_in:
        np_load_old = np.load
        np.load = lambda *a, **k: np_load_old(*a, allow_pickle=True, **k)
        loaded_1 = np.load(file_in)
        np.load = np_load_old
        print(file_in+" "+str(len(loaded_1.f.arr_0)))
        sample_1_seq=loaded_1.f.arr_0 

    if file_name_1 + "_vec" in file_in:   
        np_load_old = np.load
        np.load = lambda *a, **k: np_load_old(*a, allow_pickle=True, **k)
        loaded_2 = np.load(file_in)
        np.load = np_load_old
        print(file_in+" "+str(len(loaded_2.f.arr_0)))  
        sample_1_embed=loaded_2.f.arr_0 

    if file_name_2+"_seq"  in file_in:
       np_load_old = np.load
       np.load = lambda *a, **k: np_load_old(*a, allow_pickle=True, **k)
       loaded_3 = np.load(file_in)
       np.load = np_load_old
       print(file_in+" "+str(len(loaded_3.f.arr_0)))
       sample_2_seq=loaded_3.f.arr_0

    if file_name_2 + "_vec" in file_in:
        np_load_old = np.load
        np.load = lambda *a, **k: np_load_old(*a, allow_pickle=True, **k)
        loaded_4 = np.load(file_in)
        np.load = np_load_old
        print(file_in+" "+str(len(loaded_4.f.arr_0)))
        sample_2_embed=loaded_4.f.arr_0 

    return sample_1_seq, sample_1_embed, sample_2_seq, sample_2_embed

, и я использую следующий метод длявызовите вышеуказанную функцию.

pool = mp.Pool(4)   
sample_1_seq, sample_1_embed, sample_2_seq, sample_2_embed =zip(*pool.starmap(save, [(file_in, file_name_1, file_name_2) for file_in in save_list_in]))    
pool.close() 

Результаты: Я получаю sample_1_seq, sample_1_embed, sample_2_seq, sample_2_embed каждый длиной 4. Мои желаемые результаты в sample_1_embed[1], sample_1_seq[0], sample_2_embed[2], sample_2_seq[3].Мне интересно, почему я получаю свои результаты sample_1_embed[1] вместо одного списка sample_1_embed.

sample_1_embed[1] instead of sample_1_embed
sample_1_seq[0] instead of sample_1_seq
sample_2_embed[2] instead of sample_2_embed
sample_2_seq[3] instead of sample_2_seq

Кроме того, как этот порядок индексов списков присваивается ему?Например,

sample_1_embed[1] instead of sample_1_embed[0] or sample_1_embed[2] or sample_1_embed[3]
sample_1_seq[0] instead of sample_1_seq[1] or sample_1_seq[2] or sample_1_seq[3]
sample_2_embed[2] instead of sample_2_embed[1] or sample_2_embed[1] or sample_2_embed[3]
sample_2_seq[3] instead of sample_2_seq[0] or sample_2_seq[1] or sample_2_seq[2]
...