Python многопроцессорная обработка с использованием пула starmap - PullRequest
0 голосов
/ 09 марта 2020

У меня есть процесс, который требует прохождения определенного количества файлов. Процесс полностью независим от каждого файла. Поэтому я решил, что распараллеливание процесса - хорошая идея.

Поэтому я узнал, что могу использовать модуль Pool из библиотеки Python multiprocessing для достижения своей цели.

Моя функция имеет подпись my_function(arg1,arg2,arg3,arg4). Сначала я использовал Pool.map, но потом я узнал, что Pool.starmap - это то, что я хочу для нескольких аргументов.

Проблема в том, что Pool.map имеет аналог Pool.imap, который возвращает итерацию для простоты создания индикатор выполнения с tqdm. Pool.starmap по умолчанию не предоставляет эту итерацию, но этот SO-ответ предоставляет самодельное решение, хотя оно не работает в моем случае со следующей ошибкой:

'Pool' object has no attribute '_guarded_task_generation'

Я предполагаю, что ошибка, вероятно, связана с некоторым обновлением модуля Pool. Поэтому, посмотрев на модуль Pool и функцию imap, на которой работает функция istarmap, я, вероятно, смогу исправить ошибку.

Сделав это, я наткнулся на это предупреждение в imap Определение функции модуля Pool:

    def imap(self, func, iterable, chunksize=1):
        '''
        Equivalent of `map()` -- can be MUCH slower than `Pool.map()`.
        '''

И мне интересно: если использование imap вместо map может значительно ухудшить производительность, это правильный путь для мониторинга многопроцессорного процесса? Есть ли другой способ? Как такие модули, как PyTorch, эффективно обеспечивают индикатор выполнения для многопроцессорных процессов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...