Rust 在没有不稳定的功能或外部机箱的情况下,如何在指定的时间内读取mpsc::channel?

Rust 在没有不稳定的功能或外部机箱的情况下,如何在指定的时间内读取mpsc::channel?,rust,timeout,channel,Rust,Timeout,Channel,我正在尝试在指定的时间内连续读取。我想出了以下解决办法 pub fn get<T>( rx: &Receiver<T>, get_duration: time::Duration, ) -> Result<(), Err> { let (dur_tx, dur_rx) = channel(); let _ = thread::spawn(move || { // timer to kill rece

我正在尝试在指定的时间内连续读取。我想出了以下解决办法

pub fn get<T>(
    rx: &Receiver<T>,
    get_duration: time::Duration,
) -> Result<(), Err> {
    let (dur_tx, dur_rx) = channel();
    let _ = thread::spawn(move || {
        // timer to kill receiving
        thread::sleep(get_duration);
        let _ = dur_tx.send("tick");
    });

    let mut time_to_break = false;
    while time_to_break == false {
        match rx.try_recv() {
            Ok(resp) => {
                //...
            }
            Err(_) => ()
        }
        thread::sleep(time::Duration::from_millis(1)); // avoid using cpu 100%
        let _ = dur_rx.try_recv().map(|_| time_to_break = true);
    }
    Ok(())
}
pub-fn-get(
接收:&接收器,
获取持续时间:时间::持续时间,
)->结果{
let(dur_tx,dur_rx)=信道();
让|=线程::繁殖(移动| |{
//终止接收的计时器
线程::睡眠(获取持续时间);
让uu=dur_utx.send(“勾选”);
});
让mut time_to_break=false;
而时间到中断==假{
匹配rx。尝试_recv(){
正常(resp)=>{
//...
}
错误(41;)=>()
}
thread::sleep(time::Duration::from_millis(1));//避免100%使用cpu
让u=dur_rx.try_recv().map(| | time_to_break=true);
}
好(())
}
如果没有不稳定或不推荐的功能(例如)或外部板条箱,是否有更好的方法解决此问题?

您可以使用,这也应该更整洁:

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(())
}

您不能使用?虽然,可能您需要,但它仍然不稳定。我想在固定的时间内(比如一分钟)读取所有响应。Tbh我唯一的问题是必须手动睡眠以避免cpu的过度使用,例如Go中的一些事情是用select处理的,我猜是select!宏也做了类似的事情,“没有外部板条箱”的目的是什么?板条箱周围会生锈,建议您使用其他人的工作。我不明白为什么这么多人认为这是一件坏事:/我认为使用外部板条箱来做这么简单的事情是不必要的。虽然我发现这些板条箱中的大多数都很好,但有时确实感觉有点像NodeJ最终拥有一百万个依赖项。我想知道Rust内部使用了什么来不消耗cpu使用率?您可以查看源代码:
#![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(())
}