tokio::sync::mpsc
- Rust kursu
- İleri seviye
- Ders 23/81
- 4 dk
Asenkron kanalları ve senkron mpsc'den farkını öğrenirsin.
tokio::sync::mpsc
Tokio'nun kanalı async görevler içindir: recv().await thread'i bloke etmeden bekler. Kanal sınırlıdır (bounded): kapasite dolunca send().await yer açılana kadar bekler. Buna geri basınç (backpressure) denir ve hızlı üreticinin belleği doldurmasını önler:
let (tx, mut rx) = tokio::sync::mpsc::channel(2); // kapasite 2
tokio::spawn(async move {
for i in 1..=5 {
tx.send(i).await.unwrap(); // dolu ise bekler
}
});
while let Some(n) = rx.recv().await {
println!("{n}");
}std karşılığı: sync_channel
Standart kütüphanede sınırlı kanal sync_channel(kapasite) ile kurulur; dolu kanala send thread'i bloke eder:
let (tx, rx) = mpsc::sync_channel(2);
thread::spawn(move || {
for i in 1..=5 {
tx.send(i).unwrap(); // kanalda 2 mesaj varsa bekler
}
});
let toplam: i32 = rx.iter().sum();sync_channel(0) bir "buluşma" kanalıdır: gönderici, alıcı mesajı alana kadar bekler.
Uygulama Geri basınç
Kapasitesi 2 olan bir sync_channel aç. Üretici thread 1'den 5'e kadar sayıları göndersin; ana thread rx.iter().sum() ile toplasın ve yazdırsın.
Başlangıç kodu
use std::sync::mpsc;
use std::thread;
fn main() {
// buraya yaz
}Örnek çözüm
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::sync_channel(2);
thread::spawn(move || {
for i in 1..=5 {
tx.send(i).unwrap();
}
});
let toplam: i32 = rx.iter().sum();
println!("{}", toplam);
}Beklenen çıktı
15
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Sınırsız bir kanalda üretici tüketiciden çok daha hızlıysa ne olur?
- Üretici otomatik yavaşlar
- Mesajlar atılır
- Panic
- Mesajlar birikir ve bellek kullanımı sınırsız büyür Doğru cevap
Açıklama: std::sync::mpsc::channel sınırsızdır; sınırlı sürüm sync_channel(n)'dir.
2 Sınırlı kanal
let (tx, rx) = mpsc::____(2);
let (tx, rx) = mpsc::sync_channel(2);
Açıklama: sync_channel(n) en fazla n mesaj tutan bir kanal açar.
3 Kanal ve davranışı
| Kavram | Anlamı |
|---|---|
mpsc::channel() |
Sınırsız |
mpsc::sync_channel(2) |
Kapasite 2 |
sync_channel(0) |
Buluşma |
tokio mpsc::channel(n) |
Async, sınırlı |