Ограниченные каналы
С ограниченными (синхронными) каналами send() может блокировать текущий поток:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
fn main() {
let (tx, rx) = mpsc::sync_channel(3);
thread::spawn(move || {
let thread_id = thread::current().id();
for i in 0..10 {
tx.send(format!("Message {i}")).unwrap();
println!("{thread_id:?}: sent Message {i}");
}
println!("{thread_id:?}: done");
});
thread::sleep(Duration::from_millis(100));
for msg in rx {
println!("Main: got {msg}");
}
}
This slide should take about 8 minutes.
- Вызов
send()блокирует текущий поток, пока в канале не появится место для нового сообщения. Поток может заблокироваться бесконечно, если никто не читает из канала. - Как и у неограниченных каналов, вызов
send()завершится с ошибкой, если канал закрыт. - Ограниченный канал размером ноль называется «rendezvous channel» (канал рандеву). Каждая отправка блокирует текущий поток, пока другой поток не вызовет
recv().