#oneshot-channel #oneshot #channel #async #performance #concurrency #future

no-std async-oneshot

一个快速、小巧、功能齐全、支持异步的 oneshot 通道

10 个版本 (4 个重大更新)

0.5.9 2021 年 3 月 13 日
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

Download history 5542/week @ 2024-03-31 4396/week @ 2024-04-07 5170/week @ 2024-04-14 5782/week @ 2024-04-21 5717/week @ 2024-04-28 4964/week @ 2024-05-05 5636/week @ 2024-05-12 5273/week @ 2024-05-19 5771/week @ 2024-05-26 5660/week @ 2024-06-02 4266/week @ 2024-06-09 5146/week @ 2024-06-16 5095/week @ 2024-06-23 3800/week @ 2024-06-30 4860/week @ 2024-07-07 4810/week @ 2024-07-14

18,830 每月下载量
用于 44 个 crate(18 个直接使用)

MPL-2.0 许可证

16KB
252

async-oneshot

License Package Documentation

一个快速、小巧、功能齐全、支持异步的 oneshot 通道。

功能

  • 速度极快!请参见下面的 性能 部分。
  • 代码小巧,只有一个依赖项,构建速度极快。
  • 完全支持 no_std(使用 allocArc 提供支持)。
  • 独特功能:发送者可以等待接收者正在等待。

用法

#[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 并手动使用原子位运算进行同步以提高性能。我们相信它是正确的,但我们欢迎更多人关注它。

另请参阅

关于基准测试的说明

这些基准测试是合成的,有点娱乐性。

变更日志

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