Lock
- Python kursu
- İleri seviye
- Ders 34/83
- 5 dk
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 += 1async 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
# 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
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
import asyncio
lock = asyncio.____()
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 |