Async Rust: tokio ile Asenkron Programlamaya Giriş

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust'ta asenkron programlama, thread'leri (iş parçacıklarını) bloklamadan aynı anda binlerce görevi (task) yürütmenize olanak tanır. Özellikle ağ istekleri, dosya okuma veya veritabanı işlemleri gibi I/O bound (Giriş/Çıkış odaklı) işlerde sistem kaynaklarını çok daha verimli kullanmanızı sağlar.

1. Async/Await Mantığı: Future'lar​

Rust'ta bir fonksiyonu async fn olarak tanımladığınızda, bu fonksiyon çağrıldığı an çalışmaz. Bunun yerine, gelecekte tamamlanacak bir işlemi temsil eden bir Future döndürür.
  • async: Bir kod bloğunu veya fonksiyonu asenkron hale getirir.
  • .await: İşlem tamamlanana kadar mevcut görevi duraklatır ve kontrolü Executor'a (yürütücüye) geri verir. Bu sırada thread başka işler yapmaya devam edebilir.

2. Neden Tokio?​

Rust standart kütüphanesi asenkron yapılar için gerekli olan temel trait'leri (Future gibi) sunar ancak bunları çalıştıracak bir Runtime (çalışma zamanı) sunmaz. Tokio, Rust ekosistemindeki en popüler, hızlı ve güvenilir asenkron runtime'dır.
Tokio'nun sundukları:
  • Çok iş parçacıklı bir zamanlayıcı (Scheduler).
  • Asenkron dosya ve ağ (TCP/UDP) işlemleri.
  • Zaman aşımı (Timeout) ve kanal (Channel) yapıları.

3. Temel Bir Tokio Uygulaması​

Bir asenkron fonksiyonu çalıştırmak için bir giriş noktasına ihtiyacınız vardır. Tokio ile bu #[tokio::main] makrosu ile yapılır:
Rust
Kod:
#[tokio::main]
async fn main() {
    println!("İşlem başlıyor...");
    
    // Asenkron bir fonksiyonu çağırıp sonucunu bekliyoruz
    let sonuc = sayi_getir().await;
    
    println!("Sonuç: {}", sonuc);
}

async fn sayi_getir() -> i32 {
    // Yapay bir bekleme (thread'i bloklamaz!)
    tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
    42
}

4. Görevleri Paralelleştirmek: tokio::spawn

thread::spawn OS düzeyinde yeni bir thread açarken, tokio::spawn çok daha hafif olan bir Tokio Task (görev) oluşturur. Bir thread içinde binlerce task çalışabilir.
Rust
Kod:
use tokio;

#[tokio::main]
async fn main() {
    let handle = tokio::spawn(async {
        // Arka planda çalışan bir görev
        println!("Arka plan görevi çalışıyor");
    });

    // Ana akış devam eder...
    handle.await.unwrap();
}

5. Select! Makrosu​

Tokio'nun en güçlü araçlarından biri select! makrosudur. Birden fazla asenkron işlemden hangisi önce biterse onun sonucunu almanızı sağlar.
Rust
Kod:
tokio::select! {
    val = islem_bir() => {
        println!("İşlem 1 önce bitti: {}", val);
    }
    val = islem_iki() => {
        println!("İşlem 2 önce bitti: {}", val);
    }
}

Özet: Senkron vs Asenkron​

ÖzellikSenkron (Threads)Asenkron (Tokio)
BirimOS Thread (Ağır)Task / Green Thread (Hafif)
BloklamaThread beklerken boş durur..await ile thread başka işe geçer.
KapasiteYüzlerce thread.Milyonlarca task.
KullanımCPU yoğun işlemler (Matematik).I/O yoğun işlemler (Web/Veritabanı).
 
Geri
Üst