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 并发

Download history 1363/week @ 2024-04-11 1526/week @ 2024-04-18 1384/week @ 2024-04-25 1151/week @ 2024-05-02 1155/week @ 2024-05-09 1297/week @ 2024-05-16 891/week @ 2024-05-23 895/week @ 2024-05-30 931/week @ 2024-06-06 1584/week @ 2024-06-13 1508/week @ 2024-06-20 1557/week @ 2024-06-27 1043/week @ 2024-07-04 1232/week @ 2024-07-11 1234/week @ 2024-07-18 1042/week @ 2024-07-25

每月 4,889 次下载

Apache-2.0

140KB
4K SLoC

交叉火力

Build Status License Cargo Documentation Rust 1.36+

此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