11 个版本

0.5.0 2022 年 4 月 14 日
0.4.1 2021 年 2 月 8 日
0.4.0 2021 年 1 月 31 日
0.3.3 2021 年 1 月 24 日
0.1.0 2021 年 1 月 10 日

#214 in 异步

Download history 13594/week @ 2024-03-14 14416/week @ 2024-03-21 9610/week @ 2024-03-28 14294/week @ 2024-04-04 13381/week @ 2024-04-11 16359/week @ 2024-04-18 18571/week @ 2024-04-25 16645/week @ 2024-05-02 17949/week @ 2024-05-09 19328/week @ 2024-05-16 9896/week @ 2024-05-23 5657/week @ 2024-05-30 4497/week @ 2024-06-06 5481/week @ 2024-06-13 6414/week @ 2024-06-20 5567/week @ 2024-06-27

22,937 每月下载量
32 个 Crates 中使用 (12 直接)

MIT 许可证

435KB
6.5K SLoC

功能丰富的、可移植的异步通道库 > crates.io > docs.rs

为什么使用 Postage?

  • 包含丰富的通道集。 | barrier | broadcast | dispatch | mpsc | oneshot | watch
  • 与任何 executor 一起使用。
    • 目前为 tokioasync-std 编写了回归测试。
    • 使用 futures-traits 功能,通道实现了 futures Sink/Stream 特性。
  • 经过充分测试。
    • 通道具有完整的单元测试覆盖率和多个异步 executor 的集成测试覆盖率。
  • 包含内置的 SinkStream 组合器。
    • Sink 可以进行链式和过滤。
    • Stream 可以进行链式、过滤、映射和合并。
    • Sink 和 Stream 可以记录它们的值,便于应用程序调试。

通道

postage::barrier

屏障通道可用于同步事件,但不传输任何数据。当发送者被丢弃(或调用 tx.send(())),接收者将被唤醒。这可以用于在任务之间异步协调操作。

postage::broadcast

广播通道在多个发送者和多个接收者之间提供可靠的广播传递。该通道具有固定容量,当缓冲区填满时,发送者将被挂起。

当克隆接收者时,两个接收者将接收到相同的消息序列。

发送者还提供了一个 subscribe() 方法,该方法创建一个接收器,该接收器将观察在调用 subscribe 之后发送的所有消息。

postage::dispatch

分发通道提供多发送者、多接收者的消息分发。一条消息最多只能被一个接收者观察到。该通道具有固定容量,当缓冲区填满时,发送者将被挂起。

可以使用 rx.clone()tx.subscribe() 来创建接收器。

postage::mpsc

Postage 包含一个固定容量的多生产者、单消费者通道。生产者可以被克隆,当通道填满时,发送任务将被挂起。

postage::oneshot

Oneshot 通道在发送者和接收者之间传输单个值。两者都不能被克隆。如果发送者失败,接收者将收到一个 None 值。

postage::watch

Watch 通道可以用来异步传输状态。当创建接收器时,它们将立即收到一个初始值。它们还将收到新值,但不保证收到 每个 值。

通过 watch 通道传输的值必须实现 Default。实现这一点的一种简单方法是传输 Option<T>

基准测试

postage 通道的基准测试,以及与之相当的 async-std/tokio 通道。

  • send/recv 测量发送和接收一个项目所需的总时间。
  • send full 测量发送一个项目并在满通道上获得 Poll::Pending 值所需的时间。
  • recv empty 测量在空通道上获取 Poll::Pending 值所需的时间。

所有基准测试都是使用 criterion 进行的,位于 benches 目录中。

通道 send/recv send full recv empty
broadcast postage 114ns 7ns 8ns
broadcast tokio 98ns (-14%) 54ns 37ns
-
dispatch postage 80ns 26ns 25ns
dispatch async_std 41ns (-48%) 10ns 11ns
-
mpsc postage 83ns 27ns 30ns
mpsc tokio 85ns (+1%) 2ns 35ns
-
watch postage 96ns - 7ns
watch tokio 73ns (-23%) - 75ns

依赖项

~1–7.5MB
~35K SLoC