10 个版本 (4 个重大更新)
0.5.9 |
|
---|---|
0.5.0 | 2021 年 3 月 13 日 |
0.4.2 | 2020 年 10 月 11 日 |
0.3.3 | 2020 年 8 月 25 日 |
0.1.0 | 2019 年 5 月 30 日 |
#14 在 #oneshot-channel 中
18,830 每月下载量
用于 44 个 crate(18 个直接使用)
16KB
252 行
async-oneshot
一个快速、小巧、功能齐全、支持异步的 oneshot 通道。
功能
- 速度极快!请参见下面的
性能
部分。 - 代码小巧,只有一个依赖项,构建速度极快。
- 完全支持
no_std
(使用alloc
为Arc
提供支持)。 - 独特功能:发送者可以等待接收者正在等待。
用法
#[test]
fn success_one_thread() {
let (s,r) = oneshot::<bool>();
assert_eq!((), s.send(true).unwrap());
assert_eq!(Ok(true), future::block_on(r));
}
性能
async-oneshot 随附基准测试套件,您可以使用 cargo bench
运行。
所有基准测试都是单线程的,在我的机器上花费十几个纳秒。async 基准测试使用 futures_lite::future::block_on
作为执行器。
我的机器上的数据
以下是来自我的主要机器的基准测试数据,这是一台 Ryzen 9 3900X,运行 alpine linux 3.12,我尝试将其锁定在最大 CPU。
create_destroy time: [51.596 ns 51.710 ns 51.835 ns]
send/success time: [13.080 ns 13.237 ns 13.388 ns]
send/closed time: [25.304 ns 25.565 ns 25.839 ns]
try_recv/success time: [26.136 ns 26.246 ns 26.335 ns]
try_recv/empty time: [10.764 ns 11.161 ns 11.539 ns]
try_recv/closed time: [27.048 ns 27.159 ns 27.248 ns]
async.recv/success time: [30.532 ns 30.774 ns 31.011 ns]
async.recv/closed time: [28.112 ns 28.208 ns 28.287 ns]
async.wait/success time: [56.449 ns 56.603 ns 56.737 ns]
async.wait/closed time: [34.014 ns 34.154 ns 34.294 ns]
简而言之,我们非常快。我认为接近最优。
与其他库的比较
与 futures
中的 oneshot 通道相比,速度不是很快。
Tokio 展示了出色的抵抗,并让我们努力改进。总的来说,我认为我们整体上略快一些,但非常接近。
关于安全性的说明
这个 crate 使用 UnsafeCell 并手动使用原子位运算进行同步以提高性能。我们相信它是正确的,但我们欢迎更多人关注它。
另请参阅
- async-oneshot-local(单线程)
- async-spsc(SPSC)
- async-channel(MPMC)
关于基准测试的说明
这些基准测试是合成的,有点娱乐性。
变更日志
v0.5.0
重大更改
Sender.send()
现在只接受一个可变引用而不是移动。
v0.4.2
改进
- 添加了一些测试来覆盖上一个版本中发布的重复修复。
- 对一些代码进行内联,以提高性能。
v0.4.1
修复
- 移除了一些过于激进的
debug_assert
,这些断言在重复唤醒的情况下会导致开发过程中的崩溃。感谢 @nazar-pc!
改进
- 更好的基准测试,基于criterion。
v0.4.0
重大更改
Sender.wait()
的函数签名已更改,现在是一个非async fn
,返回一个impl Future
。这减少了二进制文件大小、运行时以及可能的内存使用。感谢 @zserik!
修复
- 在接收器轮询期间,发送者在狭窄的时间窗口内关闭,但没有唤醒接收器。感谢 @zserik!
改进
- 静态断言。感谢 @zserik!
v0.3.3
改进
- 更新
futures-micro
并改进测试
v0.3.2
修复
- 在丢弃接收器时出现段错误。由一个打字错误引起,哎呀!感谢 @boardwalk!
v0.3.1
改进
- 移除对ManuallyDrop与UnsafeCell冗余的使用。感谢 @cynecx!
v0.3.0
改进
- 重写、基准测试和优化。
v0.2.0
- 第一个真正发布版本。
版权和许可证
版权(c)2020 James Laver,async-oneshot 贡献者。
此源代码形式受Mozilla公共许可证第2.0版的条款约束。如果此文件未附带MPL副本,您可以在http://mozilla.org/MPL/2.0/获取一个副本。
依赖项
~60KB