FastAPI, yol işlemleri için hem async def hem de normal def destekler. Seçim performans açısından önemlidir: bloklamayan I/O await edebileceğinizde kullanın, kodunuz engelleme (senkron) işlemleri çağırdığında ise normal kullanın.
FastAPI, yol işlemleri için hem async def hem de normal def destekler. Seçim performans açısından önemlidir: bloklamayan I/O await edebileceğinizde kullanın, kodunuz engelleme (senkron) işlemleri çağırdığında ise normal kullanın.
async defdef@app.get("/async")
async def async_endpoint():
data = await fetch_from_api() # await non-blocking I/O — efficient
return data
@app.get("/sync")
def sync_endpoint():
data = blocking_db_call() # ordinary blocking code
return data
async def → runs on the main event loop. Efficient ONLY if you await non-blocking calls.
⚠️ A BLOCKING call inside async def blocks the WHOLE event loop → kills concurrency!
def → FastAPI runs it in a THREAD POOL, so blocking code doesn't block the event loop.
Safe for synchronous/blocking libraries.
# ✅ async def — when you can await async libraries (httpx, async DB drivers)
async def get_user():
async with httpx.AsyncClient() as c:
return await c.get(url)
# ✅ plain def — when using SYNCHRONOUS/blocking libraries (requests, sync ORM)
def get_user():
return requests.get(url).json() # blocking → FastAPI runs it in a thread
# ❌ THE DANGEROUS MISTAKE — blocking call inside async def
async def bad():
return requests.get(url).json() # blocks the event loop! Use `def` or an async client
Kritik kural: async def içine asla engelleme çağrıları koymayın — event loop'u engeller ve eşzamanlılığı bozar. Ya await ile async kütüphane kullanın, ya da normal def (FastAPI bunu thread pool'da güvenli bir şekilde çalıştırır) kullanın.
async def ve def arasında doğru seçim yapılması API'nizin performansını ve eşzamanlılığını doğrudan etkiler ve yanlış yapmak yaygın, ciddi bir hatadır.
Temel fikir, async def yalnızca bloklamayan işlemleri await ettiğinizde faydalıdır — engelleme çağrısını (senkron requests kütüphanesi veya engelleme veritabanı sürücüsü gibi) async def içine koymak tüm event loop'u engeller, tüm eşzamanlı istekleri dondurur ve async'in amacını bozar.
Bunun tersine, FastAPI akıllıca normal def endpoints'i bir thread pool'da çalıştırır, bu nedenle senkron/engelleme kodu orada güvenlidir.
Bu kuralı anlamak — gerçek async kütüphaneleriyle async def kullanın, engelleme kodu için normal def kullanın ve async def içine asla engelleme çağrılarını karıştırmayın — yüksek performanslı FastAPI endpoints'i yazabilmek ve tüm istekleri yanlışlıkla engellenen event loop'un arkasında seri hale getirmenin hafif ama yıkıcı hatası için gereklidir.