Вы можете сделать это с помощью recv_timeout
, что также должно быть намного лучше:
pub fn get<T>(rx: &Receiver<T>, get_duration: Duration) -> Result<(), Error> {
let start_time = Instant::now();
loop {
let now = Instant::now();
if start_time + get_duration > now {
let duration = start_time + get_duration - now;
match rx.recv_timeout(duration) {
Ok(resp) => {
// handle message
}
Err(RecvTimeoutError::Timeout) => break,
Err(RecvTimeoutError::Disconnected) => {
// handle disconnect
}
}
} else {
break;
}
}
Ok(())
}
Когда recv_deadline
стабилизируется, вы можете сделатьэто еще проще, потому что вы просто рассчитаете крайний срок один раз, а затем продолжите его пропускать, вместо того, чтобы пересчитывать новую продолжительность каждой итерации.
Редактировать: Пример того, почему выследует использовать recv_deadline
, когда он станет стабильным, это ошибка в коде, который я только что дал вам.Duration
всегда положительный, но мой первоначальный расчет не проверял, чтобы предотвратить недостаточный уровень, который вызвал бы периодическую панику.Я обновил его сейчас, чтобы убедиться, что этого не произойдет.
Вот как это будет выглядеть, если использовать крайние сроки (в Nightly Rust):
#![feature(deadline_api)]
pub fn get<T>(rx: &Receiver<T>, get_duration: Duration) -> Result<(), Error> {
let deadline = Instant::now() + get_duration;
loop {
match rx.recv_deadline(deadline) {
Ok(resp) => {
// handle message
}
Err(RecvTimeoutError::Timeout) => break,
Err(RecvTimeoutError::Disconnected) => {
// handle disconnect
}
}
}
Ok(())
}