import multiprocessing as mp
if __name__ == '__main__':
#pool = mp.Pool(M)
p1 = mp.Process(target= target1, args= (arg1,))
p2 = mp.Process(target= target2, args= (arg1,))
...
p9 = mp.Process(target= target9, args= (arg9,))
p10 = mp.Process(target= target10, args= (arg10,))
...
pN = mp.Process(target= targetN, args= (argN,))
processList = [p1, p2, .... , p9, p10, ... ,pN]
У меня есть N различных целевых функций, которые потребляют неравное нетривиальное количество времени для выполнения.Выполнить список процессов без многопроцессорной пула map
Я ищу способ выполнить их параллельно, чтобы M (1 < M < N) выполнялись одновременно. И как только процесс завершится, следующий процесс должен начинаться с списка, пока все процессы в processList
не будут завершены.
Поскольку я не называю одну и ту же целевую функцию, я не мог использовать Pool
.
Я считал делать что-то вроде этого:
for i in range(0, N, M):
limit = i + M
if(limit > N):
limit = N
for p in processList[i:limit]:
p.join()
Поскольку мои целевые функции потребляют неодинаковое время выполнения, этот метод не очень эффективен.
Любые предложения? Заранее спасибо.
EDIT: Заголовок вопроса был изменен на «Выполнение списка процессов без многопроцессорной карты пулов» из «Выполнить список процессов без многопроцессорного пула».
Вы можете изменить свой код, чтобы иметь только один цель. –
Да, перестановка может решить проблему. Я не хочу этого делать, потому что мои цели принадлежат к разным модулям, и это часть «большого» проекта.Спасибо @BenjaminToueg! – Shravan
Вы можете сделать это, используя пул. Наличие разных функций только мешает вам использовать 'Pool.map'. См. Ответ Джилл Бейтс. – Dunes