В настоящее время я модифицирую существующую программу, чтобы она содержала функции многократной обработки, чтобы она могла более эффективно использоваться в многоядерных системах.Я использую многопроцессорный модуль Python3 для реализации этого.Я довольно новичок в многопроцессорной обработке, и мне было интересно, насколько эффективен мой дизайн.
Общие этапы выполнения моей программы следующие:
Mainпроцесс
- вызывает функцию function1 () -> создает пул рабочих и выполняет определенные операции параллельно.закрыть пул.
- вызов функции2 () -> создать пул рабочих и выполнять определенные операции параллельно.закрыть пул.
- вызовите функцию 3 () -> создать пул рабочих и выполнять определенные операции параллельно.закройте бассейн.
- и повторяйте до конца.
Теперь вы можете спросить, зачем мне создавать пул рабочих и закрывать его в каждой функции.Причина в том, что после завершения одной функции мне нужно объединить все результаты, которые были обработаны параллельно, и вывести некоторые статистические значения, необходимые для следующей функции.Так, например, function1 () может получить среднее значение, необходимое для function2 ().
Теперь я понимаю, что создание пула работников постоянно требует затрат на Python.Мне было интересно, есть ли способ сохранить рабочих между функцией 1 и функцией 2, потому что природа распараллеливания одинакова в обеих функциях.
Одним из способов, которым я думал, было создание объекта mp.Pool в главном процессе и передача его в качестве аргумента каждой функции, но я не уверен, будет ли это правильным способом сделать это.Также стоит отметить, что меня также беспокоит использование памяти программой.
Я надеюсь, что кто-нибудь сможет подтвердить мою идею или предложить лучший способ достижения того же самого.
* отредактируйте мысль, что было бы более полезно, если бы я включил некоторый код.
pool = mp.Pool(processes=min(args.cpu, len(chroms)))
find_and_filter_reads_partial = partial(find_and_filter_reads, path_to_file, cutoff)
filtered_result = pool.map(find_and_filter_reads_partial, chroms)
pool.close()