Я хочу выполнить функцию параллельно для нескольких файлов и сохранить результаты в словаре с именем файла в качестве ключа.
Но то, что я получаю от этого, это только <multiprocessing.pool.ApplyResult at 0x7f37065fac40>
для каждой статьи словаря.
Как я могу получить результаты в каждой словарной статье напрямую?
Кроме того, я хотел бы следить за ходом выполнения общей задачи (сколько файлов было обработано (например, печать файла i/total).
Я пробовал следующее:
from multiprocessing import Pool
import os
def process(file):
# processings ...
return results
pool = Pool()
result_dict = {}
for file in os.listdir("<DIRPATH>"):
result_dict[file] = pool.apply_async(process, file)
pool.close()
pool.join()
Метод multiprocessing.pool.Pool.apply_async
возвращает экземпляр multiprocessing.pool.AsyncResult
, представляющий «будущий» результат. То есть, чтобы получить фактический результат, вы должны вызвать метод get
для этого экземпляра, который будет блокироваться до тех пор, пока фактический результат не будет доступен, а затем вернуть этот результат. Итак, вам нужно изменить код следующим образом:
from multiprocessing import Pool
import os
def process(file):
# processings ...
return results
pool = Pool()
result_dict = {}
for file in os.listdir("<DIRPATH>"):
result_dict[file] = pool.apply_async(process, file)
for k, v in result_dict.items():
# Update key with the actual result:
result_dict[k] = v.get()
pool.close()
pool.join()
Что касается вашего второго вопроса, касающегося отображения прогресса, вы должны опубликовать новый вопрос (вы не можете публиковать несколько вопросов в одном сообщении, которые совершенно не связаны между собой). Если вы хотите, как только вы это сделаете, вы можете добавить комментарий к этому ответу со ссылкой на новый вопрос, и если я смогу, я посмотрю на него.