Async Channels
Several crates have support for asynchronous channels. For instance tokio:
use tokio::sync::mpsc; async fn ping_handler(mut input: mpsc::Receiver<()>) { let mut count: usize = 0; while let Some(_) = input.recv().await { count += 1; println!("Received {count} pings so far."); } println!("ping_handler complete"); } #[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. 
                    - 
Change the channel size to 3and see how it affects the execution.
- 
Overall, the interface is similar to the syncchannels as seen in the morning class.
- 
Try removing the std::mem::dropcall. What happens? Why?
- 
The Flume crate has channels that implement both syncandasyncsendandrecv. This can be convenient for complex applications with both IO and heavy CPU processing tasks.
- 
What makes working with asyncchannels preferable is the ability to combine them with otherfutures to combine them and create complex control flow.