Python GIL (Global Interpreter Lock) & Asyncio vs Multiprocessing
CPython'un tek seferde sadece tek bir thread'in bytecode çalıştırmasına izin veren koruma kilidi.
Tek bir mikrofon olan bir toplantı odasıdır. Masada 8 kişi (8 Thread) otursa da mikrofona aynı anda sadece 1 kişi konuşabilir. Gerçek paralellik için yan odaya ayrı insan grubu koymak gerekir (Multiprocessing).
CPython bellek yönetiminde Reference Counting kullanır. Race condition'ları engellemek için GIL vardır. Bu yüzden standart multithreading CPU-yoğun işlerde çok çekirdekten (Multi-Core) yararlanamaz. I/O işlerinde Asyncio veya Threading etkiliyken, CPU-yoğun işlerde Multiprocessing şarttır.
“GIL, CPython'un bellek güvenliği için koyduğu bir kilittir. Ağ ve veritabanı beklemesi gibi I/O işlemlerinde GIL serbest bırakıldığı için Asyncio mükemmel çalışır. Ancak görüntü işleme veya makine öğrenimi gibi CPU işlemlerinde GIL nedeniyle multiprocessing (ProcessPoolExecutor) kullanılmalıdır.”
import asyncio
async def fetch_data(api_id: int):
# I/O beklemesinde event loop diğer göreve geçer:
await asyncio.sleep(1)
return f"Sonuç {api_id}"
async def main():
results = await asyncio.gather(*(fetch_data(i) for i in range(100)))
print("100 istek 1 saniyede bitti!")
FastAPI async endpoint'i içinde bloklayıcı time.sleep() veya requests.get() çağırarak tüm asenkron Event Loop'u kilitlemek (bunun yerine httpx ve asyncio.sleep kullanılmalıdır).