Задать вопрос
@lamernoob

Почему цикл for блокирует асинхронное выполнение программы?

У меня есть функция, которая берет все аккаунты пользователей из базы данных, а затем берет каждый из них и подключается к нему. Я использую ключевое слово await перед вызовом функции pool_user, однако цикл не переходит к следующей итерации, пока происходит подключение к аккаунту, хотя в функции pool_user нет ничего, что могло бы блокировать асинхронный цикл.
async def start(bot: Bot):
    async def pool_user(account):
        user = User(account, bot)
        if await user.connect():
            users[account.id] = user
        else:
            await bot.send_message(user.owner_id, str(f"Произошла ошибка входа в аккаунт {user.name}!"))
    accounts = db.account.get_all_accounts()
    for account in accounts:
        await pool_user(account)


При этом если создать задачу для каждого аккаунта, то всё выполняется параллельно.
async def start(bot: Bot):
    async def pool_user(account):
        user = User(account, bot)
        if await user.connect():
            users[account.id] = user
        else:
            await bot.send_message(user.owner_id, str(f"Произошла ошибка входа в аккаунт {user.name}!"))
    accounts = db.account.get_all_accounts()
    for account in accounts:
        asyncio.create_task(pool_user(account))


Возможно я слабо понимаю асинхронность, но прочитав несколько статей по этому поводу мне кажется, что это должно работать.
  • Вопрос задан
  • 207 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Ключевое слово await заставляет ожидать завершения всей функции и только потом происходит переход к следующей итерации.
Если использовать asyncio.create_task, то создается и запускается фоновая задача - цикл продолжается после запуска этой асинхронной функции и не ждет ее завершения.

хотя в функции pool_user нет ничего, что могло бы блокировать асинхронный цикл

Во-первых, там есть подключение if await user.connect()
Во-вторых, ты отправляешь сообщение если подключиться не удалось await bot.send_message

Но в любом случае ты постоянно делаешь подключение, которое и блокирует выполнение функции
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы