Async function is not working asynchronously

Viewed 146

I have a question.

I wrote a simple code that mimics http request:

from asyncio import sleep, run


async def get():
    print("Started get()")
    await sleep(3)
    print("Finished get()")


async def async_main():
    await get()
    await get()
    await get()


if __name__ == "__main__":
    run(async_main())

I expected that the result should be like:

Started get()
Started get()
Started get()
(No output, just wait 3 seconds)
Finished get()
Finished get()
Finished get()

But the result was:

Started get()
(No output, just wait 3 seconds)
Finished get()
Started get()
(No output, just wait 3 seconds)
Finished get()
Started get()
(No output, just wait 3 seconds)
Finished get()

Why this is happening?

2 Answers

just run the task asynchronously like below

async def async_main():
    await asyncio.gather(get(), get(), get())

if __name__ == "__main__":
    # run(async_main()) or
    asyncio.run(async_main())

You need to schedule the coroutines, either explicitly using asyncio.create_task() or implicitly using asyncio.gather():

from asyncio import sleep, run


async def get():
    print("Started get()")
    await sleep(3)
    print("Finished get()")


async def async_main():
    tasks = [asyncio.create_task(get()), 
             asyncio.create_task(get()),
             asyncio.create_task(get())]  # Explicit
    await asyncio.gather(*tasks)

async def async_main(): # Option 2
    await asyncio.gather(get(), get(), get())  # Implicit

if __name__ == "__main__":
    run(async_main())
Related