3 puan yazan GN⁺ 2024-05-09 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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.

Henüz yorum yok.