Rust是否有办法“关闭”某个频道,similar to what is available in Go?
我们的想法是遍历频道(不断接收),直到频道指示它不再产生任何值。
use std::sync::{Arc, Mutex};
use std::thread;
use std::sync::mpsc;
fn main() {
let data = Arc::new(Mutex::new(0u32));
let (tx, rx) = mpsc::channel::<u32>();
{
let (data, tx) = (data.clone(), tx.clone());
thread::spawn(move || {
for _ in 0..10 {
let mut data = data.lock().unwrap();
*data += 1;
tx.send(*data).unwrap();
}
// *** How could I close the channel here, to signal the work is done?
});
}
// *** How can I detect a closed channel here? Pattern matching?
for _ in 0..10 {
let x = rx.recv().unwrap();
println!("{}", x);
}
}
答案 0 :(得分:16)
当所有发件人都已丢弃时,该频道将关闭。在您的代码中,您克隆并为每个线程分别提供一个,这些线程在线程结束时应该丢弃。最后一个发送者位于主线程中,您应该在生成所有线程后立即删除它:drop(tx)
。
最后,最简单的接收方式是 drop(tx)
。
for elt in rx {
/* */
}
当通道关闭时,此循环结束。