CodeBlanks Logo Icon CodeBlanks

try_recv

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

main.rs
use std::sync::mpsc::{self, TryRecvError};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
match rx.____() {
    Ok(m) => println!("{m}"),
    Err(_) => println!("henüz yok"),
}
Cevap
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

İleri seviye bölümündeki tüm dersler