10 个版本

0.1.0-pre82023年1月25日
0.1.0-pre72022年11月13日
0.1.0-pre42022年10月30日
0.1.0-beta22022年7月15日

并发 中排名第 58

Download history 10632/week @ 2024-03-14 9930/week @ 2024-03-21 11067/week @ 2024-03-28 9748/week @ 2024-04-04 13232/week @ 2024-04-11 11902/week @ 2024-04-18 13488/week @ 2024-04-25 11900/week @ 2024-05-02 14362/week @ 2024-05-09 13383/week @ 2024-05-16 12209/week @ 2024-05-23 14170/week @ 2024-05-30 14000/week @ 2024-06-06 13402/week @ 2024-06-13 12914/week @ 2024-06-20 9211/week @ 2024-06-27

每月下载量 52,566
用于 26 Crates(直接使用 25 个)

MIT 许可证

155KB
2.5K SLoC

Kanal

这是 Rust 应得的快速同步和异步通道!

Crates.io Documentation MIT licensed

什么是 Kanal

Kanal 库是 CSP(通信顺序进程)模型的通道的 Rust 实现,旨在帮助程序员创建高效的并发程序。该库提供了具有高级功能的多个生产者和多个消费者通道,以及只分配指针大小的堆上的无锁一次性通道,从而实现快速通信。该库侧重于通过同步和异步 API 的组合来统一 Rust 代码的同步和异步部分之间的消息传递,同时保持高性能。

为什么 Kanal 更快?

  1. Kanal 采用高度优化的复合技术进行对象传输。当数据大小小于或等于指针大小时,它使用序列化,将数据编码为指针地址。相反,当数据大小超过指针大小时,该协议采用类似于 Go 编程语言使用的策略,利用直接内存访问从发送者的堆栈复制对象或直接写入接收者的堆栈。这种复合方法不仅消除了不必要的指针访问,而且还消除了有界(0)通道的堆分配。
  2. Kanal 使用特别调优的互斥锁作为其通道锁定机制,这是由于通道的内部锁定时间是可预测的。也就是说,可以使用 Rust 标准互斥锁的 std-mutex 功能,而 Kanal 在该功能上也将比竞争对手表现更好。
  3. 利用 Rust 高性能编译器和强大的 LLVM 后端,以及高度优化的内存访问和深入思考的算法。

为什么使用 Kanal?

  • Kanal 在通信方面既快又高效
  • Kanal 可以通过提供将发送者/接收器转换为其他 API 的方法在同步和异步之间以及同步和异步之间进行通信。
  • 与其他 Rust 库相比,Kanal 提供了更干净的 API
  • 与Golang类似,您有权访问Close函数,您可以从通道的任何实例广播关闭信号,以关闭通道的两端。
  • Kanal提供了一个包含高性能MPMC通道和无锁单次通道的包。

为什么不使用Kanal呢?

  • Kanal的开发人员正在尽力审计Kanal的小型代码库,以确保没有未定义的行为。Kanal使用Unsafe。如果您在项目中对此不满意,我们建议使用只提供安全的替代方案。

基准测试结果

结果基于每个场景每秒可以传递多少消息。

测试类型

  1. Seq是在同一线程中顺序写入和读取通道。
  2. SPSC是一个接收者、一个发送者,在它们之间传递消息。
  3. MPSC是多个发送线程和只有一个接收者。
  4. MPMC是多个发送者和多个接收者通过同一通道进行通信。

消息类型

  1. usize测试是传输硬件指针大小大小的消息。
  2. big测试是传输8倍于硬件指针大小的消息。

N/A表示由于测试对象的限制,测试主题无法执行测试,一些测试对象没有为大小为0的通道、MPMC或无界通道实现。

机器:AMD Ryzen Threadripper 2950X 16-核处理器
Rust:rustc 1.66.1 (90743e729 2023-01-10)
Go:go version go1.19.5 linux/amd64
操作系统(uname -a):Linux 5.15.0-58-generic #64~20.04.1-Ubuntu SMP Fri Jan 6 16:42:31 UTC 2023 x86_64
日期:2023年1月25日

基准测试代码

Benchmarks

为什么在某些测试中异步的性能优于同步?

在某些测试中,异步通信的性能可能优于同步通信。这可以归因于tokio等库的上下文切换性能,类似于Golang,当通道上有就绪消息时,它们会在同一线程内部使用上下文切换来切换到下一个协程。这种方法比在单独的线程之间进行通信更有效。同样的原则也适用于异步网络应用程序,它们通常比同步实现具有更好的性能。随着通道大小的增加,在同步基准测试中可能会观察到性能的改进,因为发送线程可以直接将数据推送到通道队列,而不需要等待接收线程的阻塞/挂起信号。

依赖关系

~170KB