کانالهای 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وasyncsendوrecvرا اجرا میکنند. این کار میتواند برای برنامههای پیچیده با taskهای پردازشی IO و CPU سنگین مناسب باشد. -
چیزی که کار با کانالهای
asyncرا ترجیح میدهد، توانایی ترکیب آنها با دیگرfutureبرای ترکیب آنها و ایجاد جریان کنترل پیچیده است.