WSGI ile ASGI arasındaki fark nedir? Gunicorn, Uvicorn ve FastAPI/Django bu yapıda nereye oturur?
Cevap
WSGI (PEP 3333) ve ASGI, Python web uygulamaları ile web sunucuları arasındaki standart arayüzlerdir. WSGI senkron, ASGI asenkron bir arayüzdür.
| WSGI | ASGI | |
|---|---|---|
| Model | İstek başına senkron çağrı | async coroutine, event loop |
| Protokoller | Yalnızca HTTP istek/yanıt | HTTP, WebSocket, HTTP/2, lifespan olayları |
| Eşzamanlılık | Process/thread sayısı kadar | Tek process'te binlerce bekleyen bağlantı |
| Framework örnekleri | Flask, Django (klasik) | FastAPI, Starlette, Django (3.0+ ASGI desteği) |
| Sunucu örnekleri | Gunicorn, uWSGI | Uvicorn, Hypercorn, Daphne, Granian |
# WSGI uygulaması
def app(environ, start_response):
start_response("200 OK", [("Content-Type", "text/plain")])
return [b"merhaba"]
# ASGI uygulaması
async def app(scope, receive, send):
await send({"type": "http.response.start", "status": 200,
"headers": [(b"content-type", b"text/plain")]})
await send({"type": "http.response.body", "body": b"merhaba"})Production'da tipik kurulum
# FastAPI: Uvicorn worker'ları
uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4
# Django (WSGI)
gunicorn myproject.wsgi:application --workers 4 --threads 2Önlerinde genelde Nginx veya bir load balancer TLS sonlandırma ve statik dosya için durur. Kubernetes'te çoğu zaman pod başına tek process çalıştırıp ölçeklemeyi replica sayısıyla yapmak tercih edilir.
Dikkat
ASGI'ye geçmek otomatik hız kazandırmaz. async def endpoint içinde senkron bir DB sürücüsü veya requests kullanırsanız event loop'u bloklarsınız ve tüm istekler bekler. Ya async kütüphaneler (asyncpg, httpx) kullanın ya da FastAPI'de endpoint'i normal def olarak tanımlayın; FastAPI onu thread pool'da çalıştırır.
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.