Как использовать многопроцессорность в цикле for - PullRequest
1 голос
/ 17 июня 2020

Я новичок в Python multiprocessing. У меня есть функция, которая возвращает значения и должна действовать параллельно. Ниже вы можете найти образец кода.

import multiprocessing as mp
from tqdm import tqdm

def foo(self):
    arg_triplets = [(self.loc_x[ii], self.loc_y[jj], self.arg) 
                    for ii in np.arange(0, self.nx) for jj in np.arange(0, self.ny)]
    ctx = mp.get_context('fork')
    max_proc = mp.cpu_count()-1
    pool = ctx.Pool(processes=max_proc)
    return_values = list(tqdm(pool.imap(target_foo, arg_triplets), total=nx*ny))
    pool.close()
    pool.join()

Итак, когда я запускаю эту процедуру один раз, все работает нормально. Функция target_foo принимает тройки аргументов и возвращает все выходные значения в виде списка. Я могу следить за состоянием своего 8-ядерного процессора и видеть, что 7 из них работают одновременно. Но проблема начинается, когда я использую функцию foo в for l oop. Например, мне нужно собрать данные для нескольких foo, которые мне не нужны параллельно. Итак, я создаю for l oop, который последовательно вызывает foo. Предполагается, что при каждом вызове foo функция target_foo работает параллельно. Проблема в том, что первый раз он работает параллельно, а со второго - нет. Что я делаю не так?

...