бот на python aiogram перестаёт работать во время выполнения функции

import asyncio
import logging
import sys
from PIL import Image

import cv2
import urllib.request


import numpy as np
from aiogram import Bot, Dispatcher, Router, F
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart, Command
from aiogram.types import Message
from aiogram.utils.markdown import hbold
import urllib

from env import Swapper, CustomInputFile, TOKEN


dp = Dispatcher()
router = Router()
dp.include_router(router)

user_images = {}
is_processing = {}


@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
    await message.answer(f"Привет, {hbold(message.from_user.full_name)}!")


@dp.message(Command('swap'))
async def swap_handler(message: Message):
    global is_processing
    is_processing[message.from_user.id] = False
    await message.answer("Отправьте два изображения для обработки.")


async def process_images(user_id, message):
    image = Swapper.Swap(user_images[user_id]['image1'], user_images[user_id]['image2'])
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_pil = Image.fromarray(image_rgb)
    input_file = CustomInputFile(image_pil, 'image.jpg')

    await message.answer_photo(input_file)
    await message.answer_document(input_file)

    del user_images[user_id]

@dp.message(F.photo)
async def photo_handler(message: Message):
    global user_images
    user_id = message.from_user.id

    if user_id not in user_images:
        user_images[user_id] = {'image1': None, 'image2': None}

    photo_data = message.photo[-1]
    photo_file = await bot.get_file(photo_data.file_id)
    photo_url = f'https://api.telegram.org/file/bot{TOKEN}/{photo_file.file_path}'

    req = urllib.request.urlopen(photo_url)
    arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
    image = cv2.imdecode(arr, -1)

    if user_images[user_id]['image1'] is None:
        await message.answer('Отлично, отправь второе изображение, с которого ты возьмёшь лицо.')
        user_images[user_id]['image1'] = image
    else:
        user_images[user_id]['image2'] = image

    if user_images[user_id]['image1'] is not None and user_images[user_id]['image2'] is not None:
        await message.answer('Отлично, изображения обрабатываются! Ожидание от 10 секунд до нескольких минут, в зависимости от лиц на изображении.')
        asyncio.create_task(process_images(user_id, message))

@dp.message(F.text == 'привет')
async def ph(message: Message):
    await message.answer('Привет')

async def main() -> None:
    global bot
    bot = Bot(TOKEN, parse_mode=ParseMode.HTML)
    await dp.start_polling(bot)

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Вот полный код бота. Сама функция "смены лиц" в отдельном файле env, там всё работает на нейронках insightface и GFPGAN, обе запускаются на ЦП(за неимением CUDA).

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


Ответы (0 шт):