在 Rust 中耗尽 mspc 通道的最佳方法是啥?
Posted
技术标签:
【中文标题】在 Rust 中耗尽 mspc 通道的最佳方法是啥?【英文标题】:What is the Best Way to Drain a mspc channel in Rust?在 Rust 中耗尽 mspc 通道的最佳方法是什么? 【发布时间】:2022-01-21 00:41:56 【问题描述】:我需要遍历当前存储在接收器中的所有值,然后继续执行程序的其余部分,其实现方式如下:
loop
match receiver.recv_timeout(std::time::Duration::from_nanos(0))
Ok(value) => //do stuff with the value,
_ => break
感觉这不是最好/最简单的方法。据我所知,接收器结构中没有'drain
'函数,如果接收器中没有更多值,'iter
'方法将导致通道暂停当前线程并等待下一个。
这是一个应该如何工作的示例:
use std::sync::mpsc::channel;
use std::thread::spawn;
use std::thread::sleep;
let (sender,receiver) = channel();
spawn(move ||
for i in 0..1000
sender.send(i).unwrap();
sleep(std::time::Duration::from_nanos(10));
);
sleep(std::time::Duration::from_millis(1000));
loop
match receiver.recv_timeout(std::time::Duration::from_nanos(0))
Ok(value) =>
println!("received ", value);
,
_ =>
break;
,
println!("done");
【问题讨论】:
【参考方案1】:您可以使用try_recv
和while let
来获得更简洁明了的循环:
while let Ok(value) = receiver.try_recv()
println!("received ", value);
【讨论】:
以上是关于在 Rust 中耗尽 mspc 通道的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Kubernetes 的 Nginx Ingress 对象中设置代理通道的最佳方法是啥
在 Rust 程序和嵌入式 WebAssembly 运行时之间进行通信的最佳实践是啥?
使用 MongoDB 的 Rust 驱动程序访问嵌套结构中的数据的最佳方式是啥,所有这些都是可选的?