CodeBlanks Logo Icon CodeBlanks

Özet - Tokio

spawn ve select!'i birleştirerek iki asenkron görevi yarıştırırsın.

Tokio özeti

Tokio, async Rust için runtime sağlar: #[tokio::main] girişi, tokio::spawn ile hafif görevler, tokio::sync ile görevler arası iletişim (mpsc, oneshot, Mutex), tokio::fs/net ile asenkron G/Ç ve select!/timeout ile yarış ve iptal. Altın kural: async görevde bloke eden çağrı yapma; gerekiyorsa spawn_blocking kullan.

İşçi deseni

Göndericinin kopyası her işçiye verilir; asıl gönderici bırakılınca, tüm işçiler bittiğinde alıcı yineleyicisi sona erer:

let (tx, rx) = mpsc::channel();
for id in 0..4 {
    let tx = tx.clone();
    thread::spawn(move || tx.send(id * 10).unwrap());
}
drop(tx);                          // asıl göndericiyi bırak
let sonuclar: Vec<i32> = rx.iter().collect();   // 4 sonuç, sıra belirsiz

Sonuçların sırası belirsiz olduğu için yalnızca sıradan bağımsız özetler (toplam, adet) güvenle yazdırılabilir.

Uygulama İşçilerden topla

Dört işçi thread'i başlat; her biri id * 10 değerini aynı kanala göndersin. Asıl göndericiyi bırak, sonuçları rx.iter() ile topla ve N sonuç, toplam X biçiminde yazdır.

Başlangıç kodu

main.rs
use std::sync::mpsc;
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();
    for id in 0..4 {
        let tx = tx.clone();
        thread::spawn(move || tx.send(id * 10).unwrap());
    }
    drop(tx);
    let sonuclar: Vec<i32> = rx.iter().collect();
    let toplam: i32 = sonuclar.iter().sum();
    println!("{} sonuç, toplam {}", sonuclar.len(), toplam);
}

Beklenen çıktı

4 sonuç, toplam 60

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Birçok işçinin sonuçlarını tek bir yerde toplamak için hangi desen uygundur?

  • Her işçiye kopyalanmış bir gönderici (tx.clone()), tek alıcı Doğru cevap
  • Her işçiye ayrı global değişken
  • Her işçi dosyaya yazar
  • Mümkün değil

Açıklama: mpsc: çok üretici, tek tüketici. Tüm göndericiler bırakılınca alıcının döngüsü kendiliğinden biter.

2 Asıl göndericiyi bırak

Soru
for id in 0..4 {
    let tx = tx.clone();
    thread::spawn(move || tx.send(id).unwrap());
}
____(tx);
let hepsi: Vec<i32> = rx.iter().collect();
Cevap
for id in 0..4 {
    let tx = tx.clone();
    thread::spawn(move || tx.send(id).unwrap());
}
drop(tx);
let hepsi: Vec<i32> = rx.iter().collect();

Açıklama: Asıl tx bırakılmazsa rx.iter() hiç bitmez.

3 Grubun özeti

Kavram Anlamı
#[tokio::main] Runtime girişi
tokio::spawn Görev
select! İlk biten kazanır
spawn_blocking Bloke eden iş

İleri seviye bölümündeki tüm dersler