ITADN
zesterer/flume
zesterer/flume · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Flume

一个极速的多生产者、多消费者通道。

Cargo Documentation License actions-badge Casual Maintenance Intended

use std::thread;

fn main() {
    println!("Hello, world!");

    let (tx, rx) = flume::unbounded();

    thread::spawn(move || {
        (0..10).for_each(|i| {
            tx.send(i).unwrap();
        })
    });

    let received: u32 = rx.iter().sum();

    assert_eq!((0..10).sum::<u32>(), received);
}

为什么选择 Flume?

  • 功能丰富:无界队列、有界队列和会合队列
  • 快速:始终比 std::sync::mpsc 更快,有时比 crossbeam-channel 更快
  • 安全:代码库中没有任何 unsafe 代码!
  • 灵活SenderReceiver 都实现了 Send + Sync + Clone
  • 熟悉:可作为 std::sync::mpsc 的直接替代品
  • 强大:支持 MPMC 和发送超时/截止时间等附加功能
  • 简单:依赖项少,代码库精简,编译速度快
  • 异步:支持 async,包括与同步代码混合使用
  • 易用:提供强大的类 select 接口

用法

要使用 Flume,请在您的 Cargo.toml 中的 [dependencies] 部分下添加以下行:

flume = "x.y"

Cargo 特性

Flume 附带若干可选特性:

  • spin:在内部对某些类型的数据访问使用自旋锁,而非操作系统级别的同步原语(在特定工作负载下,可能在少数平台上性能更优)

  • select:添加对 Selector API 的支持,允许一个线程同时等待多个通道/操作

  • async:添加对 异步 API 的支持,包括在其他同步通道上

  • eventual-fairness:在 Selector 的实现中使用随机性,以避免偏向/饱和某些事件而非其他事件

您可以通过修改 Cargo.toml 中的依赖项来启用这些特性,如下所示:

flume = { version = "x.y", default-features = false, features = ["async", "select"] }

基准测试

尽管 Flume 拥有自己广泛的基准测试,但请不要因此认为 Flume 速度很快。 以下图表来自 crossbeam-channel 基准测试套件。

测试在配备 8/16 核心的 AMD Ryzen 7 3700x 上执行,运行 Linux 内核 5.11.2 并使用 bfq 调度器。

Flume benchmarks (crossbeam benchmark suite)

状态

Flume 目前处于非正式维护模式。这意味着该 crate 将继续 接收关键的安全和 bug 修复,但大规模的功能开发已停止。如果您正在寻找新功能, 欢迎提交 PR,我会尽量抽出时间进行审查。

开发 Flume 是一件非常有趣的事情,我很高兴看到它被这么多人成功使用。我认为 该 crate 在功能上已基本完整(除了这里那里的一些小细节)。

许可证

Flume 采用以下任一许可证: