mpsc kanalı
- Rust kursu
- İleri seviye
- Ders 19/81
- 4 dk
std::sync::mpsc ile kanal oluşturmayı öğrenirsin.
mpsc kanalı
Kanallar, thread'lerin veriyi paylaşmak yerine mesajla iletişim kurmasını sağlar: "Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş." mpsc (multiple producer, single consumer) bir gönderici (tx) ve bir alıcı (rx) verir:
use std::sync::mpsc;
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
for i in 1..=3 {
tx.send(format!("mesaj {i}")).unwrap();
}
});
for m in rx { // tx bırakılınca döngü biter
println!("{m}");
}Gönderilen değerin sahipliği alıcıya geçer; gönderen artık ona erişemez.
Kanal bir yineleyicidir
for m in rx (ya da rx.iter()) her mesajda recv çağırır ve tüm göndericiler bırakıldığında biter. Gönderici thread'in closure'ı bitince tx otomatik bırakılır; bu yüzden döngü kendiliğinden sona erer.
// mesaj sırası, tek bir gönderici için korunur
// mesaj 1
// mesaj 2
// mesaj 3Uygulama Mesajlar
Bir kanal aç. Ayrı bir thread mesaj 1, mesaj 2, mesaj 3 metinlerini göndersin; ana thread for m in rx ile her birini 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 (tx, rx) = mpsc::channel();
thread::spawn(move || {
for i in 1..=3 {
tx.send(format!("mesaj {i}")).unwrap();
}
});
for m in rx {
println!("{}", m);
}
}Beklenen çıktı
mesaj 1 mesaj 2 mesaj 3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Gönderdikten sonra değeri kullanmaya çalışmak (<code>tx.send(s); println!("{s}")</code>) ne olur?
- Çalışır
- Panic
- Boş metin yazar
- E0382: s kanala taşındı Doğru cevap
Açıklama: Sahiplik aktarımı, iki thread'in aynı veriyi aynı anda değiştirmesini imkânsız kılar.
2 Kanal aç
let (tx, rx) = mpsc::____();
let (tx, rx) = mpsc::channel();
Açıklama: mpsc::channel bir (gönderici, alıcı) ikilisi döndürür.
3 Parça ve görevi
| Kavram | Anlamı |
|---|---|
tx |
Gönderici |
rx |
Alıcı |
tx.send(v) |
Sahipliği aktarır |
for m in rx |
Göndericiler kapanana kadar |