CodeBlanks Logo Icon CodeBlanks

Lock

asyncio.Lock ile kritik bölgeyi öğrenirsin.

Lock

asyncio.Lock, bir kritik bölgeyi korur. Aynı anda yalnızca bir coroutine kilidi tutar; diğerleri bekler. Bu, paylaşılan duruma erişimi sıraya koyar.

lock = asyncio.Lock()

async with lock:
    # kritik bölge
    shared += 1

async with lock: bloğu kilidi alır; blok bitince otomatik bırakır. Aynı anda birden çok coroutine bu bloğa giremez; bekleyenler sıraya alınır.

Lock, bir kaynağa özel erişim gerektiğinde kullanılır; örneğin bir dosyaya yazma ya da sayacı güncelleme.

Kritik bölge ve paylaşım

Birden çok coroutine aynı değişkeni güncelliyorsa, ara değerler karışabilir. async with lock: bu güncellemeyi atomik hâle getirir; bir coroutine işini bitirmeden diğeri giremez.

Örnek: shared += 1 aslında oku-artır-yaz adımlarından oluşur. Bu adımlar arasında await olursa başka coroutine araya girebilir. Lock, bu adımları tek bir atomik birim yapar.

Ancak Lock aşırı kullanılırsa eşzamanlılık azalır; yalnızca gerçekten gerekli yerlerde kullan.

Uygulama Lock ile korumalı sayaç

import asyncio ile başla. shared = 0 ve lock = asyncio.Lock() tanımla (modül düzeyinde). async def inc() fonksiyonu global shared ile başlasın, async with lock: bloğu içinde shared += 1 yapsın. async def main() içinde await asyncio.gather(inc(), inc()) çağrısı yapsın; sonra return shared. print(asyncio.run(main())) çağrısını ekle.

Başlangıç kodu

main.py
# asyncio modülünü içe aktar
# shared adında bir global değişken tanımla (başlangıç 0)
# asyncio.Lock ile bir kilit nesnesi tanımla
# inc(): async with lock içinde shared değerini bir artır
# main: gather ile iki inc çağrısı, sonra shared döndür; sonucu yazdır

Örnek çözüm

main.py
import asyncio

shared = 0
lock = asyncio.Lock()

async def inc():
    global shared
    async with lock:
        shared += 1

async def main():
    await asyncio.gather(inc(), inc())
    return shared

print(asyncio.run(main()))

Beklenen çıktı

2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 async with lock: bloğu ne sağlar?

  • Yalnızca bir coroutine içeride olabilir Doğru cevap
  • Hiçbir coroutine giremez
  • Kilidi kalıcı olarak alır
  • Aynı anda birden çok coroutine girebilir

Açıklama: async with lock aynı anda tek coroutine'e izin verir; blok bitince kilit bırakılır.

2 Lock tanımla

Soru
import asyncio

lock = asyncio.____()
Cevap
import asyncio

lock = asyncio.Lock()

Açıklama: asyncio.Lock() yeni bir kilit oluşturur.

3 Lock kavramlarını eşleştir

Kavram Anlamı
asyncio.Lock() Kilit nesnesi
async with lock Kritik bölge
shared += 1 Paylaşılan güncelleme
bekleyen coroutine Sırada bekler

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