CodeBlanks Logo Icon CodeBlanks

Semaphore

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

main.py
# 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

main.py
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

Soru
import asyncio

sem = asyncio.____(3)
Cevap
import asyncio

sem = asyncio.Semaphore(3)

Açıklama: asyncio.Semaphore(3) üç izinli semafor oluşturur.

İleri seviye bölümündeki tüm dersler