try_recv
- Rust kursu
- İleri seviye
- Ders 22/81
- 4 dk
try_recv ile bloklamadan okuma yapmayı öğrenirsin.
try_recv
recv mesaj gelene kadar bekler. try_recv ise beklemeden bakar ve hemen döner. Bir oyun döngüsü ya da arayüz thread'i gibi durmaması gereken kodda kullanılır:
use std::sync::mpsc::TryRecvError;
loop {
match rx.try_recv() {
Ok(m) => isle(m),
Err(TryRecvError::Empty) => break, // şimdilik mesaj yok
Err(TryRecvError::Disconnected) => return, // gönderici kapandı
}
}İki hata türünü ayırmak önemlidir: Empty geçicidir, Disconnected kalıcıdır.
Kuyruğu boşaltmak
Kanalda biriken mesajları beklemeden toplamak için try_iter de kullanılabilir; o anda var olanları verir ve biter:
tx.send(1).unwrap();
tx.send(2).unwrap();
let bekleyenler: Vec<i32> = rx.try_iter().collect(); // [1, 2]
println!("{:?}", rx.try_recv()); // Err(Empty)Uygulama Bekleyenleri al
Bir kanala 1 ve 2 gönder. try_recv ile Empty gelene kadar mesajları bir vektöre topla. Vektörü ve son hatayı ({:?}) boşlukla yazdır.
Başlangıç kodu
use std::sync::mpsc::{self, TryRecvError};
fn main() {
// buraya yaz
}Örnek çözüm
use std::sync::mpsc::{self, TryRecvError};
fn main() {
let (tx, rx) = mpsc::channel();
tx.send(1).unwrap();
tx.send(2).unwrap();
let mut alinan = Vec::new();
let son = loop {
match rx.try_recv() {
Ok(m) => alinan.push(m),
Err(e) => break e,
}
};
println!("{:?} {:?}", alinan, son);
assert_eq!(son, TryRecvError::Empty);
}Beklenen çıktı
[1, 2] Empty
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>try_recv</code>'i boş bir döngüde sürekli çağırmanın sakıncası nedir?
- CPU'yu boşa yakar (meşgul bekleme); recv ya da recv_timeout daha uygundur Doğru cevap
- Mesaj kaybolur
- Derlenmez
- Sakıncası yok
Açıklama: try_recv, zaten çalışan bir döngünün içinde ara sıra bakmak içindir.
2 Beklemeden bak
match rx.____() {
Ok(m) => println!("{m}"),
Err(_) => println!("henüz yok"),
}
match rx.try_recv() {
Ok(m) => println!("{m}"),
Err(_) => println!("henüz yok"),
}
Açıklama: try_recv hemen döner; mesaj yoksa Empty hatası verir.
3 Yöntem ve davranış
| Kavram | Anlamı |
|---|---|
recv() |
Mesaja kadar bekler |
try_recv() |
Hemen döner |
recv_timeout(d) |
En fazla d bekler |
try_iter() |
Bekleyenleri toplar |