- Bu yazı, büyük ölçekli eşzamanlılığa sahip kullanıcı alanı yazılımlarında Rust kullanmanın zorluklarını ele alıyor.
- Rust'ın asenkron modeli, modern hesaplamanın iki temel kavramı olan eşzamanlılık ve paralelliği ele alacak şekilde tasarlanmıştır.
- Paralellik, kodun birden fazla CPU üzerinde aynı anda çalıştırılmasını içerir.
- Eşzamanlılık ise problemi ayırmayı, onu bağımsız parçalara bölmeyi ve sıra gözetmeksizin ya da kısmi bir sırayla çalıştırmayı içerir.
- Yazı, süreçler arası iletişimin maliyetli olması nedeniyle eşzamanlılık için birden fazla süreç kullanmanın sınırlarını vurguluyor.
- Aynı belleği paylaşan süreçler olan thread'ler bir alternatif olarak sunulsa da, yarış durumu ve deadlock gibi karmaşık sorunlara yol açabilir.
- Tony Hoare'un 1978 tarihli "Communicating Sequential Processes" makalesi, thread'lerin birbirlerine mesaj göndermesi için kuyruklar veya kanallar kullanılmasını önerdi; bu yaklaşım, süreç benzeri izolasyon ve daha kolay hata ayıklama gibi çeşitli avantajlar sunar.
- Rust'ın standart kütüphanesinde
std::sync::mpsc::sync_channel altında kanallar bulunur.
- Ancak, on binlerce kullanıcıya bağlı bir web sunucusu gibi yüksek düzeyde eşzamanlılık gerektiren problemler için thread'ler yeterli olmayabilir.
- Rust, bu tür durumlar için, bir fonksiyon asenkron olarak işaretlendiğinde future veya promise döndüren ve sonuç üretmek için beklenebilen
async/await modelini kullanır.
- Avantajlarına rağmen asenkron Rust, derleyiciyi her şeyin yolunda olacağına ikna etme gerekliliği gibi zorluklar barındırır. Bu da ham thread'lerle zor olabilir.
- "Atomic reference count" ya da Arc kullanımı bir çözüm olarak önerilse de, garbage collector sorunlarına benzer problemlere yol açabildiği için her derde deva değildir.
- Yazı, Rust'ın diğer alanlardaki güçlü yanlarına rağmen, büyük ölçekli eşzamanlılığa sahip kullanıcı alanı yazılımları için en uygun araç olmayabileceğini öne sürerek sona eriyor.
1 yorum
Hacker News görüşü
async'in yaygın kullanımını eleştiriyor; bunun hesaplama ağırlıklı işler için uygun olmadığını ve farklı önceliklerde çalışan thread'lerle uyumlu olmadığını savunuyor.async'in yaygın kullanımını eleştiriyor; bunun programı baştan sona async hale getirmeye ya da pek çok şey içintokiocrate'ine bağımlı olmaya zorladığını savunuyorlar.Arc'ın bilinemez bir şey olmadığını; bunun nerede ve nasıl tutulduğuna bağlı olduğunu savunuyor ve yazarın önceki zihinsel modelini Rust'a dayatmaya çalıştığını öne sürüyor.async/awaitkullanımına karşı çıkıyor; bunun dili ve ekosistemi ikiye böldüğünü ve uzun vadeli sorunlar yarattığını savunuyorlar.async-scopedgibi unsafe crate'ler kullanarak, C++ ile yazılmış olsaydı ortaya çıkacak hataların çoğunu yakalamanın makul bir uzlaşma olduğunu öne sürüyor.