7 个版本 (2 个稳定版)
1.0.1 | 2023 年 8 月 29 日 |
---|---|
1.0.0 | 2022 年 12 月 3 日 |
0.1.7 | 2021 年 8 月 21 日 |
0.1.5 | 2021 年 6 月 28 日 |
0.1.3 | 2020 年 6 月 29 日 |
#91 in 并发
每月 4,889 次下载
140KB
4K SLoC
交叉火力
此crate提供在异步-异步或异步-阻塞代码之间使用的通道,所有方向。考虑无锁实现,底层基于crossbeam-channel
性能
比std中的通道或tokio中的mpsc更快,比crossbeam本身略慢(因为异步开销唤醒发送者或接收者)。
运行基准测试以查看结果
cargo test performance --release -- --nocapture --test-threads=1
APIs
用法
将此添加到您的 Cargo.toml
[dependencies]
crossfire = "0.1"
extern crate crossfire;
extern crate tokio;
use crossfire::mpsc;
// async-async
let (tx, rx) = mpsc::bounded_future_both::<i32>(100);
tokio::spawn(async move {
for i in 0i32..10000 {
let _ = tx.send(i).await;
println!("sent {}", i);
}
});
loop {
if let Ok(_i) = rx.recv().await {
println!("recv {}", _i);
} else {
println!("rx closed");
break;
}
}
mpmc 和 mpsc 包几乎是相同的,而 mpsc 有一些优化,因为它假设只有一个消费者。
错误类型从crossbeam-channel重新导出。
兼容性
支持稳定的 Rust。主要在 tokio-0.2 上进行测试(未在 async-std 或其他运行时进行测试)。future::selects 和 timeout 工作正常,但它利用了 Rust 官方未记录的运行时行为。
参考 https://github.com/rust-lang/rust/issues/73002
内存开销
在使用 mp tx 或 mp rx 时,需要额外的内存开销来传递待处理异步生产者或消费者的 wakers。由于 waker 很小,如果您的通道很忙,可以忽略这种开销。已取消的 wakers 最终将在后来的发送/接收事件中清理。如果通道用于与 futures::select 结合的关闭通知(永远不会触发),则当前存在硬编码的阈值来清理这些已取消的 wakers。
稳定性
此通道实现服务于我们存储引擎的各种组件,欢迎您信赖它。
依赖项
~1–1.7MB
~34K SLoC