کانال‌های Async

چندین crate از asynchronous channel پشتیبانی می‌کنند. به عنوان مثال tokio:

use tokio::sync::mpsc::{self, Receiver};

async fn ping_handler(mut input: Receiver<()>) {
    let mut count: usize = 0;

    while let Some(_) = input.recv().await {
        count += 1;
        println!("تاکنون {count} عدد ping دریافت شده است.");
    }

    println!("ping_handler کامل‌شده‌است");
}

#[tokio::main]
async fn main() {
    let (sender, receiver) = mpsc::channel(32);
    let ping_handler_task = tokio::spawn(ping_handler(receiver));
    for i in 0..10 {
        sender.send(()).await.expect("Failed to send ping.");
        println!("Sent {} pings so far.", i + 1);
    }

    drop(sender);
    ping_handler_task.await.expect("Something went wrong in ping handler task.");
}
This slide should take about 8 minutes.
  • اندازه کانال را به3 تغییر دهید و ببینید که چگونه بر اجرا تأثیر می‌گذارد.

  • به‌طور‌کلی، interface شبیه به channelهای sync است که در کلاس صبح‌گاهی دیده می‌شود.

  • تماس std::mem::drop را حذف کنید. چه اتفاقی می‌افتد؟ چرا؟

  • این crate مربوط به Flume دارای کانال‌هایی است که sync و async send و recv را اجرا می‌کنند. این کار می‌تواند برای برنامه‌های پیچیده با taskهای پردازشی IO و CPU سنگین مناسب باشد.

  • چیزی که کار با کانال‌های async را ترجیح می‌دهد، توانایی ترکیب آن‌ها با دیگر future برای ترکیب آنها و ایجاد جریان کنترل پیچیده است.