Должен ли я сохранить объект пула (и его работников) на протяжении всей программы в этом случае? - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я модифицирую существующую программу, чтобы она содержала функции многократной обработки, чтобы она могла более эффективно использоваться в многоядерных системах.Я использую многопроцессорный модуль 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...