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

推荐答案

当所有发送方都已放弃时,该频道将关闭.在你的代码中,你可以克隆并给每个线程一个,当线程结束时,这些线程会自动删除.最后一个发送者在主线程中,你应该在所有线程生成后立即删除它:drop(tx).

最后,最简单的接收方式是after:drop(tx).

for elt in rx {
    /* */
}

当通道关闭时,该循环结束.

Rust相关问答推荐

通过解引用将值移出Box(以及它被脱糖到什么地方)?

自定义结果枚举如何支持`?`/`FromResidual`?

为什么';t std::cell::ref使用引用而不是非空?

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

当发送方分配给静态时,Tokio MPSC关闭通道

找不到 .has_func 或 .get_func 的 def

如何对一个特征的两个实现进行单元测试?

我们可以在 Rust 切片中使用步骤吗?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

Rust 并行获取对 ndarray 的每个元素的可变引用

如何从borrow 的异步代码运行阻塞代码?

Rust 文件未编译到 dll 中

为什么带有生命周期指定的方法不能被调用两次?

分配给下划线模式时会发生什么?

如何展平以下嵌套的 if let 和 if 语句?

Rust 异步和 AsRef 未被发送

在 FFI 的上下文中,未初始化是什么意思?

Rustlings 切片原语

如何在 nom 中构建负前瞻解析器?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?