Özet - Tokio
- Rust kursu
- İleri seviye
- Ders 12/81
- 5 dk
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 belirsizSonuç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
use std::sync::mpsc;
use std::thread;
fn main() {
// buraya yaz
}Örnek çözüm
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
for id in 0..4 {
let tx = tx.clone();
thread::spawn(move || tx.send(id).unwrap());
}
____(tx);
let hepsi: Vec<i32> = rx.iter().collect();
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ş |