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 在 并发 中排名
2,558,796 每月下载量
用于 1,909 个crate(442个直接使用)
77KB
1.5K SLoC
Flume
一个速度极快的多生产者、多消费者通道。
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的许可证是以下之一
-
Apache License 2.0,(http://www.apache.org/licenses/LICENSE2.0)
-
MIT许可证 (http://opensource.org/licenses/MIT)
依赖项
~135–530KB