3 个不稳定版本
0.3.0 | 2024 年 5 月 15 日 |
---|---|
0.2.1 | 2023 年 7 月 16 日 |
0.2.0 | 2022 年 10 月 30 日 |
0.1.1 |
|
0.1.0 |
|
#61 在 并发 中
每月 20,987 次下载
用于 9 个 Crates (7 直接)
56KB
889 行
tachyonix
一个异步、多生产者、单消费者(MPSC)有界通道,运行速度极快。
这个库是 Asynchronix 的分支,Asynchronix 是一个高性能异步计算框架,用于系统模拟。
在创建此库的过程中,没有违反任何物理定律。
概述
这是一个没有花哨功能的 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 面积有意保持较小,它并不追求成为今天这样的东西。更重要的是,它做出了权衡,这些权衡可能或可能不是可接受的,具体取决于您的用例。
- 与大多数其他异步通道类似,但不同于在
tokio
和futures
仓库中的 MPSC 通道,阻塞发送者的公平性没有强制执行:虽然第一个在满通道上阻塞的发送者确实首先被通知,但如果有另一个发送者恰好被安排在它之前,它仍然可能落后;如果您的应用程序需要更好的公平性保证,您应该使用tokio
或futures
的通道。 - 与大多数其他异步通道类似,但不同于
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
EC2 c6a.2xlarge
EC2 c6g.2xlarge
许可证
本软件根据您的选择,许可协议为Apache License, Version 2.0或MIT license。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~0.3–26MB
~332K SLoC