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 异步
22,937 每月下载量
在 32 个 Crates 中使用 (12 直接)
435KB
6.5K SLoC
功能丰富的、可移植的异步通道库 > crates.io > docs.rs
为什么使用 Postage?
- 包含丰富的通道集。 | barrier | broadcast | dispatch | mpsc | oneshot | watch
- 与任何 executor 一起使用。
- 目前为
tokio
和async-std
编写了回归测试。 - 使用
futures-traits
功能,通道实现了 futuresSink/Stream
特性。
- 目前为
- 经过充分测试。
- 通道具有完整的单元测试覆盖率和多个异步 executor 的集成测试覆盖率。
- 包含内置的 Sink 和 Stream 组合器。
- 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