Метод recv_timeout
Метод recv_timeout пытается получить значение
из канала, но, в отличие от метода recv,
не блокирует поток бесконечно. Параметром метод
принимает значение типа Duration - максимальное
время ожидания. Если значение приходит вовремя, метод
возвращает Ok(value). Если время истекло,
возвращается ошибка RecvTimeoutError::Timeout.
Если все отправители отсоединились, возвращается
RecvTimeoutError::Disconnected.
Синтаксис
receiver.recv_timeout(timeout)
Пример
Давайте отправим значение в канал из другого потока и получим его с таймаутом в одну секунду:
use std::sync::mpsc::channel;
use std::time::Duration;
use std::thread;
fn main()
{
let (tx, rx) = channel();
thread::spawn(move || {
thread::sleep(Duration::from_millis(100));
tx.send("abcde").unwrap();
});
let res = rx.recv_timeout(Duration::from_secs(1));
println!("{:?}", res);
}
Результат выполнения кода:
Ok("abcde")
Пример
Давайте попробуем получить значение с таймаутом в 100 миллисекунд, тогда как отправитель заснёт на одну секунду:
use std::sync::mpsc::channel;
use std::time::Duration;
use std::thread;
fn main()
{
let (tx, rx) = channel();
thread::spawn(move || {
thread::sleep(Duration::from_secs(1));
tx.send("abcde").unwrap();
});
let res = rx.recv_timeout(Duration::from_millis(100));
println!("{:?}", res);
}
Результат выполнения кода:
Err(Timeout)
Пример
Давайте отсоединим отправитель и попробуем получить значение с таймаутом:
use std::sync::mpsc::channel;
use std::time::Duration;
fn main()
{
let (tx, rx) = channel::<i32>();
drop(tx);
let res = rx.recv_timeout(Duration::from_secs(1));
println!("{:?}", res);
}
Результат выполнения кода:
Err(Disconnected)