异步通道

有些 crate 支持使用异步通道。例如 tokio

  1. use tokio::sync::mpsc::{self, Receiver};
  2. async fn ping_handler(mut input: Receiver<()>) {
  3. let mut count: usize = 0;
  4. while let Some(_) = input.recv().await {
  5. count += 1;
  6. println!("Received {count} pings so far.");
  7. }
  8. println!("ping_handler complete");
  9. }
  10. #[tokio::main]
  11. async fn main() {
  12. let (sender, receiver) = mpsc::channel(32);
  13. let ping_handler_task = tokio::spawn(ping_handler(receiver));
  14. for i in 0..10 {
  15. sender.send(()).await.expect("Failed to send ping.");
  16. println!("Sent {} pings so far.", i + 1);
  17. }
  18. drop(sender);
  19. ping_handler_task.await.expect("Something went wrong in ping handler task.");
  20. }
  • 将通道大小更改为 3,然后看看对操作执行会有什么影响。

  • 总体而言,该接口类似于 上午课程 中所讲的 sync 通道。

  • 尝试移除 std::mem::drop 调用。会出现什么情况?这是为什么?

  • Flume crate 包含可以同时实现 syncasync sendrecv 的渠道,为涉及 IO 和大量 CPU 处理任务的复杂应用提供了极大便利。

  • 使用 async 通道的优势在于,我们能够将它们与其他 future 结合起来,从而创建复杂的控制流。