#async-channel #bounded-channel #channel #mpsc #async #future

tachyonix

一个非常快的高速异步、多生产者、单消费者有界通道

3 个不稳定版本

0.3.0 2024 年 5 月 15 日
0.2.1 2023 年 7 月 16 日
0.2.0 2022 年 10 月 30 日
0.1.1 2022 年 10 月 16 日
0.1.0 2022 年 10 月 12 日

#61并发

Download history 4212/week @ 2024-05-02 4196/week @ 2024-05-09 3682/week @ 2024-05-16 2631/week @ 2024-05-23 4310/week @ 2024-05-30 5077/week @ 2024-06-06 3428/week @ 2024-06-13 3324/week @ 2024-06-20 3696/week @ 2024-06-27 4668/week @ 2024-07-04 6423/week @ 2024-07-11 5966/week @ 2024-07-18 5538/week @ 2024-07-25 4690/week @ 2024-08-01 6230/week @ 2024-08-08 3476/week @ 2024-08-15

每月 20,987 次下载
用于 9 个 Crates (7 直接)

MIT/Apache

56KB
889

tachyonix

一个异步、多生产者、单消费者(MPSC)有界通道,运行速度极快。

这个库是 Asynchronix 的分支,Asynchronix 是一个高性能异步计算框架,用于系统模拟。

在创建此库的过程中,没有违反任何物理定律。

Cargo Documentation License

概述

这是一个没有花哨功能的 async 通道,其唯一的名气就是非常快(见 基准测试),在正确性和实现质量方面没有走捷径。其性能主要得益于其关注 MPSC 用例以及一系列精心优化的措施,其中包括

  • 积极优化满队列和空队列事件的 通知原语(后者得益于 diatomic-waker,这是一种快速的、无自旋锁的替代方案 atomic-waker),
  • 通道创建后除了阻塞发送者的通知外,没有进行任何分配,
  • 完全没有自旋锁,热点路径上没有互斥锁(唯一的互斥锁是用于阻塞发送者通知的 std::sync::mutex),
  • 底层队列针对 单接收者 进行优化。

用法

将此添加到您的 Cargo.toml

[dependencies]
tachyonix = "0.3.0"

示例

use tachyonix;
use futures_executor::{block_on, ThreadPool};

let pool = ThreadPool::new().unwrap();

let (s, mut r) = tachyonix::channel(3);

block_on( async move {
    pool.spawn_ok( async move {
        assert_eq!(s.send("Hello").await, Ok(()));
    });
    
    assert_eq!(r.recv().await, Ok("Hello"));
});

局限性

这个库最初的目的提供的是 Asynchronix 开发的通道的一个不那么独特的兄弟版本,可以很容易地与其他通道实现进行比较基准测试。实验结果比预期的要好,因此发布了一个略微更完善的版本供公众使用,希望其他人可能觉得它有用。然而,其 API 面积有意保持较小,它并不追求成为今天这样的东西。更重要的是,它做出了权衡,这些权衡可能或可能不是可接受的,具体取决于您的用例。

  • 与大多数其他异步通道类似,但不同于在 tokiofutures 仓库中的 MPSC 通道,阻塞发送者的公平性没有强制执行:虽然第一个在满通道上阻塞的发送者确实首先被通知,但如果有另一个发送者恰好被安排在它之前,它仍然可能落后;如果您的应用程序需要更好的公平性保证,您应该使用 tokiofutures 的通道。
  • 与大多数其他异步通道类似,但不同于 futures 仓库中的 MPSC 通道,随着每个“遗忘”的阻塞发送者(即那些由于某种原因没有被轮询完成但也没有被丢弃的阻塞发送者)的增加,通道的有效容量会降低,如果有效容量降至零,通道最终会死锁;如果这种情况可能发生在您的应用程序中,您应该使用 futures 的通道。
  • 与大多数其他异步通道类似,但例外的是 flume,其底层原语依赖于 unsafe(见专用部分),
  • 不支持零容量通道(也称为 rendez-vous 通道)。

安全性

尽管注重性能,但实现质量和正确性是最高的优先级。

该库附带了一系列合理的测试,特别是对于所有低级(不安全)并发原语,它们通过与 Loom 进行广泛的测试,以及与 MIRI 进行集成测试。然而,尽管它们很棒,但 Loom 和 MIRI 不能正式证明没有数据竞争,因此 确实 可能存在健全性问题。因此,在它得到更多的野外测试之前,您在使用它之前应该谨慎对待,特别是在关键任务软件中。

基准测试

基准测试概述

实现了一个自定义的基准测试套件,可以测试多个流行的 MPSC 和 MPMC 通道,以及多个执行器(Tokio、async-std、smolscale 和 Asynchronix)。

目前包含 2 个基准测试

  • pinball:一个经典 ping-pong 基准测试的升级版,其中消息(“球”)在完全连接图中的 13 个顶点(“针”)之间进行随机游走;它由图中球的总数来参数化,
  • funnel:最常用的 MPSC 基准测试,其中消息在 13 个发送者和一个唯一接收者之间进行紧密循环发送;它由通道容量来参数化。

每个基准测试执行 61 个基本基准测试实例,这确保了所有执行器线程几乎都在忙。在通道接收者经常饥饿而发送者永远不会阻塞的情况下(即通道容量总是足够),pinball 基准测试是一个相对较好的性能代理。

尽管 funnel 基准测试很受欢迎,但它是 不太现实和不太客观 的,因为它不仅对入队、出队和通知的绝对速度敏感,而且也受到它们相对速度和其他微妙细节的强烈影响。将其推广到实际性能是有争议的。

有关这些基准测试的更多信息,请参阅 基准测试仓库

基准测试结果

请注意,原始速度并不是一切:每个通道都会在设计选择和权衡(例如不安全、公平性、mpmc 支持、...)方面做出选择,这些选择可能会对性能产生重大影响。务必阅读有关 限制安全性 的部分。

基准测试是在性能相当但微架构不同的 EC2 实例上运行的(Intel Ice Lake、AMD Zen 3、ARM Graviton 2)。报告的性能是经过 10 次基准测试平均后的每微秒消息数(数值越高越好)。

报告的结果使用Tokio获得,实际上发现它比async-std或smolscale都要快得多。Asynchronix更快,但作为基线不太相关,因为它不是为通用async编程设计的。

EC2 c6i.2xlarge

Alt text

EC2 c6a.2xlarge

Alt text

EC2 c6g.2xlarge

Alt text

许可证

本软件根据您的选择,许可协议为Apache License, Version 2.0MIT license

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~0.3–26MB
~332K SLoC