Birçok sistem dili, giriş-çıkış işlemleri için temel destek sunar, ancak genellikle senkron ve asenkron yaklaşımlar arasında belirgin bir ayrım yapmazlar. Rust, güvenliği ve verimliliği sağlamak için, I/O işlemleri de dahil olmak üzere, baştan itibaren tasarlanmıştır. Bu nedenle, Rust standart kütüphanesinde (std) sadece senkron I/O uygulanmıştır ve popüler asenkron destek ayrı dış kütüphanelere (örneğin, tokio, async-std) aktarılmıştır.
Senkron ve asenkron I/O yaklaşımlarının karıştırılması, kodun bakımını zorlaştırabilir ve güvenlik ile performans problemlerine yol açabilir, çünkü bu yaklaşımların kaynaklar, akışlar ve kilitlemelerle çalışma modelleri farklıdır. Örneğin, büyük bir dosyanın doğrudan okunması veya ağdan veri beklenmesi, yürütme akışını (ana akış dahil) bloke edebilir ve bu da uygulamayı yavaşlatır.
Rust, net bir ayrım sunar: Standart Kütüphane (std::io) — güvenli hata işleme ve kaynakların mülkiyetinin katı kontrolü ile sadece senkron I/O. Asenkron çözümler için dış kütüphaneler ve asenkron çalışma zamanları kullanılır — bunlar kendi türlerini ve API'lerini sunar, fakat benzer hata ve güvenlik anlamına sahiptir.
Senkron dosya okuma kodu örneği:
use std::fs::File; use std::io::{self, Read}; fn main() -> io::Result<()> { let mut file = File::open("foo.txt")?; let mut contents = String::new(); file.read_to_string(&mut contents)?; println!("{}", contents); Ok(()) }
Tokio ile asenkron dosya okuma kodu örneği:
use tokio::fs::File; use tokio::io::AsyncReadExt; #[tokio::main] async fn main() -> tokio::io::Result<()> { let mut file = File::open("foo.txt").await?; let mut contents = String::new(); file.read_to_string(&mut contents).await?; println!("{}", contents); Ok(()) }
Anahtar özellikler:
Senkron ve asenkron işlevler arasında geçiş yapmak için türleri (örneğin, std'den File ile tokio'dan File) doğrudan karıştırabilir miyiz?
Hayır. API düzeyinde uyumsuzlar ve standart türler asenkron özellikleri uygulamaz.
std::thread::spawn, asenkron bir işlevde senkron I/O çağrıldığında bloke olur mu?
Evet. Asenkron ortamda senkron I/O çağrılırsa, akış bloke olur, bu da asenkronlığın avantajlarını azaltır.
async fn main, çalışma zamanı (tokio veya async-std) olmadan kullanılabilir mi?
Hayır. Asenkron giriş noktası özel bir çalışma zamanı ile yürütülmelidir; aksi takdirde derleyici async fn main kullanılmasına izin vermez.
Rust'ta çoklu iş parçacıklı bir sunucuda, asenkron istek işleyicilerinde std::io'dan senkron okuma kullanılır. Bu durumda yük event loop'u bloke eder, gecikmeler artar ve sunucu zirve yüklemeleriyle başa çıkamaz.
Artıları:
Eksileri:
Asenkron kod içinde dosya ve ağ işlemleri için sadece asenkron türler kullanılır, türler titizlikle kontrol edilir ve hatalar Result üzerinden yakalanır.
Artıları:
Eksileri: