返回介绍

11.2 通道

发布于 2024-10-13 11:25:32 字数 1189 浏览 0 评论 0 收藏 0

通道 (channel)在不同线程间传递消息。

注意,值所有权从 send 转移到 recv 端。

无锁(free lock)队列设计,性能优化。

use std::thread::scope;
use std::sync::mpsc::channel;

fn main() {
  let data = vec![1, 2, 3, 4];
  let (tx, rx) = channel();

  scope(|s| {
    s.spawn(move || {
      for d in data {
        tx.send(d).unwrap();
      }
    });

    s.spawn(move || {
      for v in rx {
        println!("{}", v);
      }
    });
  });
}

标准库 mpsc 是多生产者、单消费者的 FIFO 队列,通过 clone 创建多个生产者。

当所有生产者结束( drop ),通道关闭。

use std::thread::scope;
use std::sync::mpsc::channel;

fn main() {
  let (tx, rx) = channel();

  scope(|s| {

    // 多个生产者。
    for i in 1..=10 {
      let t = tx.clone();
      s.spawn(move || {
        t.send(i).unwrap();
      });
    }

    // 销毁多余的生产者。
    drop(tx);

    // 接收数据。
    rx.into_iter().for_each(|v| println!("{}", v));
  });
}

默认 channel 创建异步(asynchronous)通道,其内部采取 “无限缓冲区”(infinite buffer)设计。也就是说,发送端不会等待接收操作,可能因发送过快导致内存等资源过多消耗。解决办法是用 sync_channel 创建固定(fixed size)缓冲区的同步(synchronous)通道。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文