本文簡要介紹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 Receiver.recv_deadline用法及代碼示例
- Rust Receiver.recv用法及代碼示例
- Rust Receiver.try_recv用法及代碼示例
- Rust Receiver.try_iter用法及代碼示例
- Rust Receiver.iter用法及代碼示例
- Rust Receiver用法及代碼示例
- Rust Result.unwrap_or_else用法及代碼示例
- Rust RefCell.try_borrow_unguarded用法及代碼示例
- Rust Ref.map用法及代碼示例
- Rust RefMut.leak用法及代碼示例
- Rust Ref.filter_map用法及代碼示例
- Rust RefCell.replace_with用法及代碼示例
- Rust Result.as_deref_mut用法及代碼示例
- Rust Result.unwrap_or_default用法及代碼示例
- Rust Result.as_mut用法及代碼示例
- Rust Result.map_or用法及代碼示例
- Rust Result.err用法及代碼示例
- Rust Result用法及代碼示例
- Rust Read用法及代碼示例
- Rust Result.is_err用法及代碼示例
- Rust Result.into_ok用法及代碼示例
- Rust Result.cloned用法及代碼示例
- Rust Result.unwrap_err用法及代碼示例
- Rust Rem用法及代碼示例
- Rust Result.expect用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::sync::mpsc::Receiver.recv_timeout。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。