为什么我的程序生成了在MPSC通道上迭代的线程,却从未退出



我制作了以下程序:

use std::process;
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
fn main() {
let (tx, rx) = mpsc::channel();
let t1 = thread::spawn(move || {
for i in 0..10 {
if i != 9 {
let msg = i32::from(i);
tx.send(msg).unwrap();
} else {
println!("Greetings from process {} of 10!", i);
for received in rx.iter().take(10) {
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}
}
});
t1.join().unwrap();
}

程序永远不会结束;它执行所有的代码,但从不结束。有人能帮我吗?

问题是Receiver上的iter()是一个阻塞调用。因此,由于CCD_;挂断";然而,它仍将被阻止,因为您只发送过9消息。如果尝试take()9或更少(即最多发送什么(,则for循环将按预期结束。

或者,您可以(1(使用try_iter(),这将在没有更多挂起的值时停止迭代,或者(2(您需要";挂断";进入for循环之前的Sender,可以通过调用drop(tx)来完成。

} else {
drop(tx);
//  ^^^^^^^^
println!("Greetings from process {} of 10!", i);
for received in rx.iter().take(10) {
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}

} else {
println!("Greetings from process {} of 10!", i);
for received in rx.try_iter().take(10) {
//                     ^^^^^^^^
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}

这当然是忽略了这样一个事实,即你试图做的事情有点令人困惑,比如线程为什么要向自己发送/接收。然而,这将解决";不退出";问题