asyncio je Python frameworkem pro concurrent I/O pomocí async/await. Spouští mnoho I/O operací kooperativně na jednom vlákně pomocí event loop — efektivní pro vysokou souběžnost I/O-bound práce (síťová volání, webové servery) bez režie vláken.
asyncio je Python frameworkem pro concurrent I/O pomocí async/await. Spouští mnoho I/O operací kooperativně na jednom vlákně pomocí event loop — efektivní pro vysokou souběžnost I/O-bound práce (síťová volání, webové servery) bez režie vláken.
import asyncio
async def fetch_data(id): # an async function = a coroutine
print(f"start {id}")
await asyncio.sleep(1) # await a non-blocking I/O operation (yields control)
print(f"done {id}")
return id
asyncio.run(fetch_data(1)) # run a coroutine from sync code
Funkce async def je coroutine; await ji pozastaví v I/O bodě, což event loop pouští jiné coroutiny — poté pokračuje, když se očekávaná operace dokončí.
# ❌ sequential — total time ≈ 3 seconds
async def slow():
await fetch_data(1) # wait 1s
await fetch_data(2) # then wait 1s
await fetch_data(3) # then wait 1s
# ✅ concurrent — total time ≈ 1 second (all run together)
async def fast():
await asyncio.gather(fetch_data(1), fetch_data(2), fetch_data(3))
asyncio.gather spouští coroutines souběžně — zatímco jeden čeká na I/O, ostatní pokračují. Tři 1-sekundové čekání se překrývají do ~1 sekundy celkem. Toto je hlavní hodnota: překrývání mnoha I/O čekání na jednom vlákně.
Threading: OS-managed, preemptive, real threads (GIL-limited for CPU)
asyncio: single thread, COOPERATIVE — coroutines yield at `await` points
→ lighter weight (handle thousands of connections), no thread overhead,
but one CPU-heavy coroutine blocks everything (no preemption)
async def bad():
time.sleep(5) # ❌ BLOCKS the whole event loop (sync sleep)
result = heavy_compute() # ❌ CPU work freezes all coroutines
async def good():
await asyncio.sleep(5) # ✅ non-blocking
# offload CPU work to a thread/process pool
await loop.run_in_executor(None, heavy_compute)
Protože je kooperativní a single-threaded, jakékoli blokující/CPU-náročné volání zmrazí všechny coroutiny. Používejte await-able async APIs a offloadujte blokující/CPU práci na executor.
✓ High-concurrency I/O: web servers (FastAPI), web scraping, many API/DB calls,
websockets, real-time apps — thousands of concurrent connections efficiently
✗ CPU-bound work — use multiprocessing instead (asyncio doesn't help)
asyncio je moderní přístup k high-concurrency I/O v Pythonu, pohání frameworky jako FastAPI a umožňuje efektivní zpracování tisíců souběžných připojení na jednom vlákně — daleko lehčeji než thread-per-connection.
Rozdělení coroutin, await, souběžné provádění s gather a zejména základní pravidlo (nikdy neblokujte event loop; offloadujte CPU/blokující práci) je nezbytné pro psaní výkonného async Pythonu.
Vědět, kdy je vhodné (I/O-bound souběžnost) versus kdy ne (CPU-bound → multiprocessing) je klíč k efektivnímu použití.