- Asyncio, Python'da I/O ağırlıklı programları ele almanın iyi bir yoludur ve temelde Python Generator'ları üzerine iyi bir katman sağlar
- Generator'lar kodu bellek açısından verimli hale getirir ve
yield anahtar sözcüğüyle bir fonksiyonu duraklatıp sürdürmeye imkan tanır
yield from kullanıldığında generator, bir alt generator'u veya iterable bir nesneyi çağırabilir; böylece bir generator zinciri oluşturulabilir
Olay döngüsü
- Asyncio'nun çekirdeğinde, mevcut task'i çalıştırıp yöneten event loop bulunur
- Event loop, task listesini yineleyerek her task'i
next(task) ile çalıştırır
- Task'ler I/O işlemi sırasında
yield kullanarak yürütmeyi duraklatır ve denetimi event loop'a geri verir
Uyutma
yield from kullanılarak bir task'e alt generator eklenebilir
- Bir sleep generator'u eklendiğinde, task'in çalışması belirtilen zamana kadar duraklatılabilir
- Sleep,
while döngüsünden çıktığında StopIteration istisnası oluşur ve task fonksiyonundaki yield from sonraki kod satırından yürümeye devam eder
Yield'dan Await'e
__await__ dunder metodu ve async anahtar sözcüğü kullanılarak yield'dan await'e geçiş yapılabilir
await anahtar sözcüğü, bir sınıf örneğinin __await__ metodunu çağırabilir veya coroutine'de (async fonksiyonuyla oluşturulan nesne) kullanılabilir
await anahtar sözcüğü, yield from ile eşdeğer görülebilir; yalnızca bazı ek geçerlilik denetimi kuralları vardır
- Kendi
Task sınıfınızı oluşturup __await__ metodunu uygulayabilir ve create_task fonksiyonuyla oluşturulan task'leri event loop'a ekleyebilirsiniz
- Event loop yöneticisi task'leri çalıştırır ve
StopIteration istisnası oluştuğunda task'i tamamlanmış olarak işaretler
- Sleep fonksiyonunun da async ile uyumlu olacak şekilde değiştirilmesi gerekir
AsyncIO ve Await
- Yukarıdaki kodda "jacobio" yerine "asyncio" koyarsanız asyncio paketini tam olarak kullanmış olursunuz
- Asyncio çok daha fazlasını yapar, ancak temel generator'lardan başlayarak asyncio'nun çekirdek kısımları sıfırdan yeniden üretilebilir
- Gerçek asyncio paketinde birden fazla task'i işlemek için
asyncio.gather() gibi fonksiyonlar kullanılabilir
GN⁺ görüşü
- Bu yazı, asyncio'nun çalışma prensibini generator kullanarak anlaşılır biçimde anlattığı için asyncio ile ilk kez karşılaşan geliştiriciler için çok faydalı görünüyor
- Asyncio, yüksek performanslı I/O işleme için optimize edilmiş bir kütüphanedir; bu yazı sayesinde iç yapısını anlamak, gerçek projelerde onu daha etkili kullanmayı sağlayabilir
- Ancak gerçek asyncio çok daha karmaşık bir yapıya sahiptir; bu yüzden pratikte kullanmak için resmî belgeler gibi kaynaklarla daha derinlemesine öğrenmek gerekecektir
- Asyncio'ya benzer işlevler sunan diğer kütüphaneler arasında Trio ve Curio da vardır; bunlarla farklarını karşılaştırmak da ilginç olabilir
- Asyncio'yu devreye alırken mevcut senkron kodla uyumluluk, hata yönetimi ve test gibi birçok unsur göz önünde bulundurulmalıdır; bu nedenle yeterli değerlendirme ve hazırlık gerekir
Henüz yorum yok.