Özet - Kanallar
- Rust kursu
- İleri seviye
- Ders 24/81
- 5 dk
mpsc ve thread'i birleştirerek iş parçacıklı bir iş kuyruğu yazarsın.
Kanallar özeti
mpsc::channel sınırsız, sync_channel(n) sınırlı kanal açar. send sahipliği aktarır; alıcı yoksa Err. recv bekler, try_recv beklemez, recv_timeout süreyle bekler; tüm göndericiler kapanınca alıcı biter. tx.clone() ile çok üretici olur. Async kodda tokio::sync::mpsc kullanılır. Kanallar, ortak durum yerine aşamalar arası veri akışı kurmanın temiz yoludur.
İşlem hattı
Her aşama bir thread'dir; aşamalar kanallarla bağlanır. Bir aşama bittiğinde göndericisi bırakılır ve kapanma zincir halinde sonraki aşamalara yayılır:
let (tx1, rx1) = mpsc::channel();
let (tx2, rx2) = mpsc::channel();
thread::spawn(move || for i in 1..=5 { tx1.send(i).unwrap(); });
thread::spawn(move || for n in rx1 { tx2.send(n * n).unwrap(); });
let sonuc: Vec<i32> = rx2.iter().collect();Uygulama İki aşamalı hat
Yukarıdaki hattı kur: ilk thread 1'den 5'e kadar sayıları göndersin, ikinci thread her sayının karesini sonraki kanala aktarsın. Ana thread sonuçları toplayıp {:?} ile yazdırsın.
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 (tx1, rx1) = mpsc::channel();
let (tx2, rx2) = mpsc::channel();
thread::spawn(move || {
for i in 1..=5 {
tx1.send(i).unwrap();
}
});
thread::spawn(move || {
for n in rx1 {
tx2.send(n * n).unwrap();
}
});
let sonuc: Vec<i32> = rx2.iter().collect();
println!("{:?}", sonuc);
}Beklenen çıktı
[1, 4, 9, 16, 25]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İki aşamalı bir hatta (üret → kare al → topla) sıra neden korunur?
- Korunmaz
- Mutex sayesinde
- Her aşamada tek bir thread var ve kanallar FIFO'dur Doğru cevap
- Rust otomatik sıralar
Açıklama: Bir aşamaya birden çok işçi eklenirse sıra garantisi kaybolur.
2 Aşamayı bağla
thread::spawn(move || for n in ____ {
tx2.send(n * n).unwrap();
});
thread::spawn(move || for n in rx1 {
tx2.send(n * n).unwrap();
});
Açıklama: İkinci aşama birinci aşamanın alıcısını dinler.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
channel() |
Sınırsız kanal |
sync_channel(n) |
Sınırlı kanal |
tx.clone() |
Çok üretici |
try_recv |
Beklemeden |