Задать вопрос
marperia
@marperia
Дизайнер, программист, писатель

Python asyncio list does not processing asyncrounouslly because of what?

А есть мысли, почему вот такой код
async def main(api_id, api_hash, tg_session, chat_id, db_session):
    async with TelegramClient(StringSession(tg_session), api_id, api_hash) as client:
        await client.start()
        chan = await client.get_entity(int(chat_id))
        events = await client.get_admin_log(chan)
        print("start for loop")

        for event in events:
            print(event.user_id)
            await asyncio.sleep(5)
            print(f"{event.user_id} awaited")
            continue

asyncio.run(main(api_id, api_hash, tg_session, parsing_chat_id, Session))

даёт вот такой вывод?
start for loop
6550133864
6550133864 awaited
5171756347
5171756347 awaited
2002370110
2002370110 awaited
1682226622

Для сравнения, нормальный пример нормального кода
async def bar(item: int) -> int:
    print("Started")
    await asyncio.sleep(5)
    print("Finished")
    return item ** 2

async def foo():
    items = range(1, 10)
    tasks = [bar(item) for item in items]
    new_items = await asyncio.gather(*tasks)
    return new_items

if __name__ == '__main__':
    results = asyncio.run(foo())
    print(results)

выводит нормальный вывод:
Started
...
Started
Finished
...
Finished
[1, 4, 9, 16, 25, 36, 49, 64, 81]
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
marperia
@marperia Автор вопроса
Дизайнер, программист, писатель
Вопрос говно, питон говно, я искал подобный go синтаксис с вейтгруппами, а нашёл вот что:
# Python 3.11+ ONLY!
async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(some_coro(...))
        task2 = tg.create_task(another_coro(...))
    print("Both tasks have completed now.")

вот тут: https://stackoverflow.com/a/42246632
Вопрос можно закрывать за неимением ответа в дискуссии.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
В первом случае ты грубо говоря все запускаешь синхронно: синхронно итерируешься по списку, await'ишь - все последовательно

Во втором случае, ты запускаешь множество асинхронных генераторов. Каждый запускается, пишет Started, достигает await и управление переходит следующему генератору. Т.е. получается - сначала все доходят до await (печатают Started), после ставятся в конец и, когда все Started уже написали, начинается исполнение того, что после await
Ответ написан
solotony
@solotony
покоряю пик Балмера
думаю что async for поможет

async for event in client.iter_admin_log(chan):
      print(event.user_id)
      await asyncio.sleep(5)
      print(f"{event.user_id} awaited")


https://superfastpython.com/asyncio-async-for/
Ответ написан
Ваш ответ на вопрос

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

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