Rust
Ö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.
Örnek çözümü göster
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);
}
Kendini test et
-
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ı
- Her işçiye ayrı global değişken
- Her işçi dosyaya yazar
- Mümkün değil
Cevabı göster
Her işçiye kopyalanmış bir gönderici (tx.clone()), tek alıcı — mpsc: çok üretici, tek tüketici. Tüm göndericiler bırakılınca alıcının döngüsü kendiliğinden biter.
-
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();
Cevabı göster
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();
-
Grubun özeti
- #[tokio::main]
- Runtime girişi
- tokio::spawn
- Görev
- select!
- İlk biten kazanır
- spawn_blocking
- Bloke eden iş
Sıradaki ders: thread::spawn