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