gpt4 book ai didi

rust - 如何在没有不稳定功能或外部包装箱的情况下从 mpsc::channel 读取指定的时间?

转载 作者:行者123 更新时间:2023-11-29 08:15:34 24 4
gpt4 key购买 nike

我正在尝试连续读取 Receiver在指定的持续时间内。我想出了以下解决方案

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

没有不稳定或弃用的功能(例如 select)或外部包装箱,是否有更好的解决方法?

最佳答案

您可以使用 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 始终为正数,但我的原始计算没有检查以防止下溢,这会导致间歇性 panic 。我现在已经更新它以确保不会发生这种情况。

下面是使用截止日期(在 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(())
}

关于rust - 如何在没有不稳定功能或外部包装箱的情况下从 mpsc::channel 读取指定的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com