Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 460
full2null Avatar asked May 24 '26 11:05

full2null


2 Answers

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())
like image 57
Bharel Avatar answered May 26 '26 00:05

Bharel


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())
like image 39
Mahamudul Hasan Avatar answered May 25 '26 23:05

Mahamudul Hasan