Есть ли у ржавчины способ «закрытия» канала, similar to what is available in Go?Закрытие канала, как в 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);
}
}
У вас есть код, который представляет собой то, что вы пытаетесь сделать? – tadman
@tadman [довольно глупо] Пример добавлен – jocull
Документы уже ответили на это сообщение: https://doc.rust-lang.org/nightly/std/sync/mpsc/struct.Sender.html#method.send Удаление команды ' tx' (как это происходит после цикла for после окончания области) приведет к тому, что 'rx' вернет' Err' вместо 'Ok' на следующий' recv'. Затем вы можете сопоставить соответствие по результату 'recv' для проверки' Ok' или 'Err'. –