4 puan yazan GN⁺ 2024-03-26 | 1 yorum | WhatsApp'ta paylaş
  • Rust topluluğunda sıkça şu soru görülüyor: thread'ler async/await'in yapabildiği her şeyi yapabiliyor ve daha basitken neden async/await seçiliyor?
  • Rust düşük seviyeli bir dil ve Coroutine karmaşıklığını gizlemiyor. Bu, programcının asenkronluğu düşünmesine gerek kalmadan varsayılan olarak asenkron çalışan Go gibi dillerin yaklaşımının tersine bir anlayış.
  • Akıllı programcılar karmaşıklıktan kaçınmaya çalışır; peki neden async/await gerekli?

Arka planı anlamak

  • Rust düşük seviyeli bir dildir. Kod genellikle doğrusaldır; bir iş bittiğinde diğeri çalışır.
  • Web sunucuları gibi aynı anda çok sayıda işin yürütülmesi gereken durumlarda doğrusal kod sorun çıkarır.
  • Erken dönem web, bu sorunu çözmek için thread kullanımını devreye sokmaya çalıştı.
  • Thread'ler kullanılarak aynı anda birden fazla istemci işlenebilir, ancak programcılar eşzamanlılığı OS alanından kullanıcı alanına taşımak istedi.

Timeout sorunu

  • Rust'ın en büyük avantajlarından biri birleştirilebilirlik (composability).
  • async/await, bu birleştirilebilirliği I/O-bound fonksiyonlara uygulamayı mümkün kılar.
  • Örneğin, istemci işleme fonksiyonuna timeout eklemek istediğinizde bunu iki combinator kullanarak gerçekleştirebilirsiniz.

Tematik thread'ler

  • Thread kullanılan örneklerde timeout uygulamak kolay değildir.
  • TcpStream içinde set_read_timeout ve set_write_timeout fonksiyonları vardır, ancak bunları kullanmak sınırlıdır.
  • Yazı, Rust combinator'leriyle timeout programlamanın bir yolunu gösteriyor; ancak bu yöntem TcpStream ile sınırlı ve ek sistem çağrıları gerektiriyor.

Async'in başarılı kullanım örnekleri

  • HTTP ekosistemi, ana runtime mekanizması olarak async/await'i benimsedi.
  • tower, timeout, rate limiting ve load balancing sağlayarak async/await'in gücünü gösteren bir örnek.
  • macroquad, motoru çalıştırmak için async/await kullanan bir Rust oyun motoru.

Async'in imajını düzeltmek

  • async'in faydaları yeterince bilinmediği için bazı kişiler bunu yanlış anlayabiliyor.
  • Rust topluluğu, async Rust'ın performans avantajlarını abartma ve anlamlı faydalarını küçümseme eğiliminde.
  • async/await, senkron Rust'ta onlarca thread ve kanal olmadan ifade edilemeyen kalıpları kısa ve net biçimde ifade edebilen güçlü bir programlama modeli olarak görülmeli.

GN⁺ görüşü

  • async/await, eşzamanlılığı ele alırken kod karmaşıklığını artırsa da aynı anda çok sayıda istemciyi verimli biçimde işleyebilme yeteneği sunar.
  • Bu yazı, async/await'in yalnızca performans avantajı değil, programlama modeli açısından da güçlü yönleri olduğunu vurguluyor.
  • Rust'taki async/await, çeşitli I/O işleri için birleştirilebilirlik sağlar; bu da özellikle ağ servisleri veya web sunucuları gibi alanlarda faydalıdır.
  • Eleştirel açıdan bakıldığında, async/await karmaşıklığı yeni başlayan geliştiriciler için giriş engeli olabilir ve bunu aşmak için eğitsel çaba gerekir.
  • Benzer işlev sunan diğer projeler arasında Node.js'in async/await uygulaması ve Python'un asyncio kütüphanesi bulunur; bunlar da benzer bir paradigma sunar.
  • async/await benimsenirken kod karmaşıklığı ve bakım kolaylığı dikkate alınmalı; ancak aynı anda çok sayıda istemci işlenmesi gerekiyorsa bu model büyük avantaj sağlar.

1 yorum

 
GN⁺ 2024-03-26
Hacker News görüşü
  • Async/await ve tek iş parçacığı

    • JavaScript modeli gibi tek iş parçacığında async/await basit ve iyi anlaşılmıştır.
    • İş parçacıkları kullanıldığında birden fazla CPU problemi çözebilir ve Rust kilit yönetimine yardımcı olur.
    • Farklı önceliklere sahip iş parçacıkları olabilir; hesaplamanın kısıtlandığı durumlarda buna ihtiyaç duyulur.
    • Çok iş parçacıklı async/await karmaşıktır. Hesaplamanın kısıtlı olduğu bölümlerde model çökebilir.
    • Rust'ta çok iş parçacıklı hesaplama iyi çalışmaz. Sorunlar arasında şunlar vardır:
      • Futex tıkanıklığı çöküşü: Bazı depolama ayırıcılarında sorun olabilir.
      • Adil olmayan mutex kaynaklı aç kalma: Standart Mutex ve crossbeam-channel kanalları adil değildir.
  • Async/await ve iş parçacıkları

    • Eleştiri karmaşıklıkla ilgili değil; seçime bağlı olarak ekosistemin bölünmesi ve seçeneklerden birinin daha aşağı kalmasıyla ilgilidir.
    • Rust ekosistemi, I/O işleri yapmak için her yerde async/await kullanılmasına karar verdi.
    • Rust, async/await dışındaki şeyleri daha iyi birleştirilebilir soyutlamalar haline getirseydi şikayetler ortadan kalkardı.
  • Yazıyla ilgili sorunlar

    • Yalnızca tek bir web sunucusu örneği verilmiş ve iş parçacıkları açısından yanlış çözülmüş.
    • Programcılar OS iş parçacıklarını değil, kavramsal ve anlamsal iş parçacıklarını istiyor.
    • OS iş parçacıkları pahalıdır; bizim istediğimiz ucuz iş parçacıklarıdır.
    • Web sunucusu örneğindeki zaman aşımı uygulamasında sorunlar var.
  • Ele alınmayan noktalar

    • async/await tek iş parçacığında çalıştığı için kilit veya senkronizasyon gerektirmez.
    • async/await'te hata yayılımı net değildir.
    • Ağ I/O'sunda backpressure konusuna da değinilmeliydi.
  • İptal konusundaki önemli nokta

    • Gelecekteki herhangi bir iş kolayca iptal edilebilir.
    • İş parçacıklarında iptal karmaşıktır ve zorla iş parçacığı durdurma güvenilir değildir.
    • Rust'ın async modelinde tüm future'lara dışarıdan timeout eklenebilir.
  • Async/await için pazarlama benzeri kampanya

    • async/await teknik bir hataydı ve topluluğa büyük bir maliyet yükledi.
    • Rust hâlâ en iyi dil, ancak bu tartışmanın sonsuza kadar sürmesinden endişe ediliyor.
  • Async/await ve fiber'lar

    • Rust daha önce green thread'lere sahipti ve bunlar bilerek kaldırıldı.
    • future'ları istenen anda drop edebilme yeteneği büyük bir maliyet getirir.
    • async/await'in birleştirilebilirliğini övmek tuhaf.
  • Rust'ta async/await'in başlıca avantajları

    • İş parçacığı veya dinamik bellek olmayan ortamlarda bile çalışabilir.
    • Eşzamanlılık kullanılarak kod daha özlü yazılabilir.
  • Async/await hakkındaki yanlış anlamalar

    • Bazı insanlar tek iş parçacığında eşzamanlılık mekanizmasının neden gerekli olduğunu anlamıyor.
    • async/await; UI programlama, GPU ile iletişim ve runtime'lar arası iletişim için faydalıdır.
  • Async/await yerine neden iş parçacığı değil

    • async/await, istemci/istek/görev durumunun bellek kullanımını azaltabilir.
    • Durum sıkıştırma, belleğin yavaş olduğu modern sistemlerde performans açısından önemlidir.
    • async/await ve CPS, istemci başına bellek kullanımını azaltmada etkilidir.