中文

Kotlin 协程中快速且可扩展的通道

数据结构与算法 2022-11-10 v1 分布式、并行与集群计算

摘要

过去十年中,异步编程获得了显著的流行:许多流行语言通过库和原生语言实现支持这一编程模式,通常表现为协程或 async/await 结构。该概念不通过共享内存编程,而是假设通过消息传递实现隐式同步。实现此类通信的关键数据结构是会合通道。粗略地说,会合通道是一个容量为 0 的阻塞队列,因此 send(e) 与 receive() 操作相互等待,在相遇时执行会合。为优化消息传递模式,通道通常配备固定大小缓冲区,使得 send(e) 操作不会挂起并将元素放入缓冲区,直至超出其容量。这一原语被称为缓冲通道。本文提出一种针对会合通道与缓冲通道的快速且可扩展的算法。与现代队列类似,我们的方案基于一个无限数组以及用于 send(e) 和 receive() 操作的两个位置计数器,利用无条件的 Fetch-And-Add 指令对其进行更新。然而,为支持完整的通道语义(如缓冲与等待请求的取消),该算法需要对这一经典模式进行非平凡的修改。我们将本方案的性能与 Kotlin 实现以及其他学术方案进行比较,展示了最高 9.8 倍的加速。为展示其表达力与性能,我们还将所提算法集成到标准 Kotlin Coroutines 库中,替换了先前的通道实现。

关键词

引用

@article{arxiv.2211.04986,
  title  = {Fast and Scalable Channels in Kotlin Coroutines},
  author = {Nikita Koval and Dan Alistarh and Roman Elizarov},
  journal= {arXiv preprint arXiv:2211.04986},
  year   = {2022}
}