Semaphore
- Python kursu
- İleri seviye
- Ders 35/83
- 5 dk
asyncio.Semaphore ile eşzamanlılık sınırını öğrenirsin.
Semaphore
asyncio.Semaphore, aynı anda çalışan coroutine sayısını sınırlar. Lock'un genelleştirilmiş halidir: n tane coroutine'e izin verir, gerisi bekler.
sem = asyncio.Semaphore(3)
async with sem:
# en fazla 3 coroutine burada
await fetch()Bu, dış servisi aşırı yüklememek için yararlıdır. Örneğin API isteklerini aynı anda 3 ile sınırlamak istersen Semaphore(3) kullanırsın.
Semaphore'un değeri her acquire'da azalır, her release'de artar. async with her iki işlemi otomatik yapar.
Sınırlama ve kaynak denetimi
Semaphore, dış kaynak tüketimini denetlemek için idealdir. Aynı anda yüzlerce API isteği yapmak yerine Semaphore(10) ile 10'arlı gruplar hâlinde ilerlersin.
Bu, hızı ve kota limitlerini dengeler: çok yavaş değil ama servis de aşırı yüklenmez. Semaphore'un değeri, deneme yanılma ile bulunur; tipik değerler 5-20 arasıdır.
Lock aslında Semaphore(1)'dir; tek izinli özel erişim sağlar.
Uygulama Semaphore ile sınırlı erişim
import asyncio ile başla. sem = asyncio.Semaphore(2) tanımla. async def fetch(n) fonksiyonu async with sem: bloğu içinde return n yapsın. async def main() içinde await asyncio.gather(fetch(1), fetch(2), fetch(3)) çağrısı yapsın ve sonucu döndürsün. print(asyncio.run(main())) çağrısını ekle.
Başlangıç kodu
# asyncio modülünü içe aktar
# iki izinli bir semafor tanımla (Semaphore, değer 2)
# fetch(n): async with sem içinde n değerini döndür
# main: gather ile üç fetch çağrısı, sonucu yazdırÖrnek çözüm
import asyncio
sem = asyncio.Semaphore(2)
async def fetch(n):
async with sem:
return n
async def main():
return await asyncio.gather(fetch(1), fetch(2), fetch(3))
print(asyncio.run(main()))Beklenen çıktı
[1, 2, 3]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Semaphore kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
Semaphore(3) |
Üç coroutine izni |
async with sem |
İzin al ve bırak |
acquire |
İzin ister |
release |
İzin bırakır |
2 Lock ile Semaphore(1) arasındaki ilişki nedir?
- İkisi de tamamen farklıdır
- Lock aslında Semaphore(1)'dir Doğru cevap
- Semaphore(1) Lock'tan daha güçlüdür
- Lock Semaphore(2)'ye eşittir
Açıklama: Lock tek izinli Semaphore'dur; yani Semaphore(1) ile aynı davranır.
3 Semaphore tanımla
import asyncio
sem = asyncio.____(3)
import asyncio
sem = asyncio.Semaphore(3)
Açıklama: asyncio.Semaphore(3) üç izinli semafor oluşturur.