pythonpython-asyncio

Async function is not working asynchronously


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 is this happening?


Solution

  • 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())