CodeBlanks Logo Icon CodeBlanks

tokio::sync::mpsc

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

main.rs
use std::sync::mpsc;
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let (tx, rx) = mpsc::____(2);
Cevap
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ı

İleri seviye bölümündeki tüm dersler