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?
- 功能丰富:无界队列、有界队列和会合队列
- 快速:始终比
std::sync::mpsc更快,有时比crossbeam-channel更快 - 安全:代码库中没有任何
unsafe代码! - 灵活:
Sender和Receiver都实现了Send + Sync + Clone - 熟悉:可作为
std::sync::mpsc的直接替代品 - 强大:支持 MPMC 和发送超时/截止时间等附加功能
- 简单:依赖项少,代码库精简,编译速度快
- 异步:支持
async,包括与同步代码混合使用 - 易用:提供强大的类
select接口
用法
要使用 Flume,请在您的 Cargo.toml 中的 [dependencies] 部分下添加以下行:
flume = "x.y"
Cargo 特性
Flume 附带若干可选特性:
-
spin:在内部对某些类型的数据访问使用自旋锁,而非操作系统级别的同步原语(在特定工作负载下,可能在少数平台上性能更优) -
select:添加对SelectorAPI 的支持,允许一个线程同时等待多个通道/操作 -
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 目前处于非正式维护模式。这意味着该 crate 将继续 接收关键的安全和 bug 修复,但大规模的功能开发已停止。如果您正在寻找新功能, 欢迎提交 PR,我会尽量抽出时间进行审查。
开发 Flume 是一件非常有趣的事情,我很高兴看到它被这么多人成功使用。我认为 该 crate 在功能上已基本完整(除了这里那里的一些小细节)。
许可证
Flume 采用以下任一许可证:
-
Apache License 2.0, (http://www.apache.org/licenses/LICENSE-2.0)
-
MIT license (http://opensource.org/licenses/MIT)
