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

В асинхронной функции при создании массива он будет асинхронным или обычным python?

Вот у меня есть код:
listok = [1, 2, 3, 4, 5]

async def check(category: int):
    global listok
    
    result = []
    
    for i in listok:
        if *Сравнение данных из базы данных и i:
            result.append(i)
    return result


Вот такой код будет асинхронно работать или все плохо будет при 10 пользователях например?
  • Вопрос задан
  • 1918 просмотров
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 5
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Глобальные переменные - зло сами по себе, а в конкурентном окружении и подавно.
Ответ написан
@Everything_is_bad
Вот такой код будет асинхронно работать или все плохо будет при 10 пользователях например?
по примеру ничего про это не сказать, потому что зависит от того как реализовано "*Сравнение данных из базы данных и i:" Открывай учебник по asyncio и внимательно читай, минимум понять разницу между await и create_task, особенно внутри циклов.
Кроме этого, тут вообще не нужен global, а использования цикла под сомнением, почему бы проверку в базе не сделать одним разом, а не генерировать кучу запросов?
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Да, будет работать асинхронно.
Но есть вопросы, если что-то добавлять в процессе в глобальную переменную.
Также есть вопросы в ползании в базу данных, тоже должно быть асинхронно.
Ответ написан
Комментировать
@VladimirP_2025
Желательно понять, что всё-таки надо сделать.
Можно попробовать использовать future:

async def main():
    # Создаем объект Future
    future = asyncio.Future()

    # Запускаем корутину, передаем Future объект в функцию
    await check(category, future)

    # Получаем результат выполнения задачи
    result = future.result()
    print(f"Результат Future: {result}")


asyncio.run(main())
Ответ написан
@Smokost
Если я сделаю вызов
await check(category=1)

То сама функция будет работаь асинхронно, по отношению к другим асинхронным функциям.
Но элементы массива внутри функции check скорей всего будут пробегаться синхронно, друг за другом.
Чтобы распараллелить обработку массива, нужно будет применить какую-то технику. Самое простое - использовать
result = await asyncio.gather(*(compare_data_from_db(i) for i in listok))

Где compare_data_from_db тоже асинхронная функция.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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