当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Receiver.recv_timeout用法及代码示例


本文简要介绍rust语言中 std::sync::mpsc::Receiver.recv_timeout 的用法。

用法

pub fn recv_timeout(&self, timeout: Duration) -> Result<T, RecvTimeoutError>

尝试在此接收器上等待一个值,如果相应的通道已挂起,或者它等待的时间超过 timeout ,则返回错误。

如果没有可用数据并且有可能发送更多数据(至少一个发送者仍然存在),此函数将始终阻塞当前线程。一旦将消息发送到相应的 Sender (或 SyncSender ),此接收器将唤醒并返回该消息。

如果相应的 Sender 已断开连接,或者在此调用阻塞时断开连接,则此调用将唤醒并返回 Err ,以指示此通道上再也无法接收到消息。但是,由于通道是缓冲的,因此在断开连接之前发送的消息仍将被正确接收。

已知的问题

当前存在一个已知问题(请参阅 #39364 ),该问题会导致 recv_timeout 在以下示例中意外Panics:

use std::sync::mpsc::channel;
use std::thread;
use std::time::Duration;

let (tx, rx) = channel::<String>();

thread::spawn(move || {
    let d = Duration::from_millis(10);
    loop {
        println!("recv");
        let _r = rx.recv_timeout(d);
    }
});

thread::sleep(Duration::from_millis(100));
let _c1 = tx.clone();

thread::sleep(Duration::from_secs(1));

例子

在遇到超时之前成功接收值:

use std::thread;
use std::time::Duration;
use std::sync::mpsc;

let (send, recv) = mpsc::channel();

thread::spawn(move || {
    send.send('a').unwrap();
});

assert_eq!(
    recv.recv_timeout(Duration::from_millis(400)),
    Ok('a')
);

达到超时时收到错误:

use std::thread;
use std::time::Duration;
use std::sync::mpsc;

let (send, recv) = mpsc::channel();

thread::spawn(move || {
    thread::sleep(Duration::from_millis(800));
    send.send('a').unwrap();
});

assert_eq!(
    recv.recv_timeout(Duration::from_millis(400)),
    Err(mpsc::RecvTimeoutError::Timeout)
);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::sync::mpsc::Receiver.recv_timeout。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。