Асинхронная работа с изображениями Python
Задача: Пишу ТГ бота с использованием Aiogram. Пользователь отправляет группу изображений, далее изображения в асинхронном режиме загружаются на диск. Далее запускается цикл обработки изображений, после завершения которого, они должны быть отправлены обратно пользователю.
Проблема: Очевидно при текущем подходе не все изображения будут обработаны, т.к. функция обработки не асинхронная. Прошу сориентировать\показать какие способы решения этой проблемы возможны. Благодарю!
п.с. я совсем новичок, поэтому по возможности, прошу объяснить как можно проще.
п.с.с. код - если нужно:
async def get_file(msg: types.Message):
path_drd = 'data/received_data'
path_dcg = 'data/changed_groups'
user_id = msg.from_user.id
create_folder(path_drd, user_id)
create_folder(path_dcg, user_id)
# функции выше просто создают папку для хранения фото от определенного пользователя
file_id = msg.document.file_id
file = await msg.bot.get_file(file_id)
file_path = file.file_path
await msg.bot.download_file(
file_path=file_path,
destination=f'{path_drd}/{user_id}/{msg.document.file_name}'
)
# асинхронная загрузка изображений
for target_folder in os.listdir(f'{path_drd}'):
if int(target_folder) == int(user_id):
for document in os.listdir(f'{path_drd}/{target_folder}'):
with Image.open(f'{path_drd}/{target_folder}/{document}') as im:
print(document)
im_crop = im.crop((0, 50, im.width, im.height))
im_crop.save(f'{path_dcg}/{target_folder}/{document}')
break
Ответы (1 шт):
Так как обработка изображения это CPU-bound задача, его нужно делать в отдельном процессе.
Для этого есть ProcessPoolExecutor который может сделать обработку в другом процессе.
Можно почитать этот пример чтобы понять как его использовать и статью про генераторы и asyncio чтобы понять как работает асинхронный код.