关闭频道,就像Go一样

时间:2015-07-13 19:27:20

标签: rust channel

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

1 个答案:

答案 0 :(得分:16)

当所有发件人都已丢弃时,该频道将关闭。在您的代码中,您克隆并为每个线程分别提供一个,这些线程在线程结束时应该丢弃。最后一个发送者位于主线程中,您应该在生成所有线程后立即删除它:drop(tx)

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

for elt in rx {
    /* */
}

当通道关闭时,此循环结束。