Skip to main content

asyncio

What asyncio is ?

  • asyncio is Python’s asynchronous I/O framework.

  • It allows you to write code that looks sequential but actually does many tasks concurrently without using multiple threads or processes.

  • It’s single-threaded and usually single-process, but it can manage thousands of I/O-bound tasks efficiently.

  • Think of it as a cooperative multitasking system inside one thread.

How it works

  • You write coroutines with async def.

  • You use await to pause a coroutine when it’s waiting for I/O (network, disk, etc.), letting other coroutines run.

  • The event loop schedules tasks efficiently.

You must run in normal script, not in Jupyter Notebook


import asyncio

async def say_after(delay, msg):
await asyncio.sleep(delay) # non-blocking sleep
print(msg)

async def main():
# run two tasks concurrently
await asyncio.gather(
say_after(2, "Hello"),
say_after(1, "World")
)

asyncio.run(main())

How asyncio compares to threads and processes

FeatureThreadingMultiprocessingasyncio
Parallel CPU usageNo (GIL)YesNo (single thread)
Concurrency typeOS-level (preemptive)OS-level (parallel)Cooperative (event-driven)
Memory overheadLowHighVery low
I/O-bound tasksGoodWorks, heavierExcellent (lightweight)
CPU-bound tasksInefficientExcellentNot suitable
ComplexityModerate (locks)HigherModerate (async/await syntax)

Purpose / When to use asyncio

  • Handle many I/O tasks efficiently without threads or processes. Examples: web servers, network clients, chat apps.

  • Avoid thread overhead and locking issues. Threads require careful synchronization; asyncio uses single-threaded cooperative multitasking.

  • Scale thousands of concurrent tasks cheaply. Example: a server handling 10,000 client connections can use a single process with asyncio instead of 10,000 threads.


import asyncio

async def say_after(delay, msg):
await asyncio.sleep(delay) # non-blocking sleep
print(msg)

async def main():
# run two tasks concurrently
await asyncio.gather(
say_after(2, "Hello"),
say_after(1, "World")
)

return 111

def nguoidingoaipho():
pass

v = main()
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
HHHHHH: <_UnixSelectorEventLoop running=True closed=False debug=False>
dir(v)
import inspect

inspect.getcoroutinestate(v)
from asyncio.events import _get_running_loop

_get_running_loop()
import asyncio
asyncio.events._running_loop.loop_pid