Класс SyncSender
Класс SyncSender - это тип отправителя,
который используется в паре с Receiver
для передачи данных между потоками. В отличие
от обычного Sender, SyncSender
имеет ограниченный буфер и блокирует поток
отправки, если буфер заполнен. Создаётся
с помощью функции sync_channel, которая
принимает размер буфера в качестве параметра.
Синтаксис
let (tx, rx) = sync_channel(bound);
Пример
Давайте создадим синхронный канал с буфером размером 2 и отправим в него несколько значений:
use std::sync::mpsc::sync_channel;
fn main()
{
let (tx, rx) = sync_channel(2);
tx.send(1).unwrap();
tx.send(2).unwrap();
tx.send(3).unwrap();
println!("{}", rx.recv().unwrap());
println!("{}", rx.recv().unwrap());
println!("{}", rx.recv().unwrap());
}
Результат выполнения кода:
1
2
3
Пример
Давайте рассмотрим пример с несколькими потоками,
где SyncSender блокирует отправку при
заполнении буфера:
use std::sync::mpsc::sync_channel;
use std::thread;
fn main()
{
let (tx, rx) = sync_channel(1);
let handle = thread::spawn(move || {
for i in 1..=5 {
tx.send(i).unwrap();
println!("sent: {}", i);
}
});
thread::sleep(std::time::Duration::from_millis(100));
for _ in 1..=5 {
let val = rx.recv().unwrap();
println!("received: {}", val);
}
handle.join().unwrap();
}
Результат выполнения кода:
sent: 1
received: 1
sent: 2
received: 2
sent: 3
received: 3
sent: 4
received: 4
sent: 5
received: 5
Смотрите также
-
функция
sync_channel,
которая создаёт синхронный канал с буфером -
класс
Sender,
который является асинхронным отправителем канала -
класс
Receiver,
который принимает данные из канала -
метод
try_send,
который пытается отправить данные без блокировки