#channel #thread #mpsc #mpmc #fifo

flume

一个速度极快的多生产者通道

36个版本

0.11.0 2023年8月16日
0.10.14 2022年7月21日
0.10.13 2022年6月10日
0.10.12 2022年3月10日
0.2.0 2019年7月31日

#5并发 中排名

Download history 552662/week @ 2024-04-22 563856/week @ 2024-04-29 521708/week @ 2024-05-06 590165/week @ 2024-05-13 582717/week @ 2024-05-20 560798/week @ 2024-05-27 631517/week @ 2024-06-03 619430/week @ 2024-06-10 577698/week @ 2024-06-17 567122/week @ 2024-06-24 548042/week @ 2024-07-01 615071/week @ 2024-07-08 613907/week @ 2024-07-15 650714/week @ 2024-07-22 640997/week @ 2024-07-29 624898/week @ 2024-08-05

2,558,796 每月下载量
用于 1,909 个crate(442个直接使用)

Apache-2.0/MIT

77KB
1.5K SLoC

Flume

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

Cargo Documentation License actions-badge

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?

  • 功能丰富:无界、有界和 rendezvous 队列
  • 快速:始终比 std::sync::mpsc 快,有时比 crossbeam-channel 也快
  • 安全:代码库中任何地方都没有 unsafe 代码!
  • 灵活:`Sender` 和 `Receiver` 都实现了 `Send + Sync + Clone`
  • 熟悉:是 `std::sync::mpsc` 的直接替代品
  • 强大:支持额外的功能,如MPMC支持和发送超时/截止日期
  • 简单:依赖项少,代码库小,编译速度快
  • 异步:支持 `async`,包括与同步代码的混用
  • 人体工程学:功能强大的 `select`-like 接口

使用方法

要使用Flume,请将以下行放在你的 `Cargo.toml` 文件中 `[dependencies]` 部分

flume = "x.y"

Cargo特性

Flume包含几个可选特性

  • spin:在某些数据访问方面使用自旋锁代替操作系统级别的同步原语(在特定平台上对于特定工作负载可能更高效)

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

  • async:添加了对 `async API` 的支持,包括对其他同步通道的支持

  • eventual-fairness:在 `Selector` 的实现中使用随机性,以避免对某些事件进行偏差/饱和

您可以通过更改 `Cargo.toml` 中的依赖项来启用这些特性

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

基准测试

尽管Flume有自己广泛的基准测试,但不要从这里得出Flume运行快的结论。下面的图表来自crossbeam-channel基准测试套件。

测试在一个运行Linux内核5.11.2,使用bfq调度器的AMD Ryzen 7 3700x处理器上,该处理器拥有8/16个核心。

Flume benchmarks (crossbeam benchmark suite)

许可证

Flume的许可证是以下之一

依赖项

~135–530KB