#channel #async-channel #mpmc #multi-consumer #async #broadcast

nightly gemino

多生产者多消费者(MPMC)广播通道

7个版本 (破坏性)

0.7.0 2023年1月18日
0.6.0 2023年1月9日
0.5.0 2023年1月8日
0.4.0 2023年1月6日
0.1.0 2023年1月3日

#854 in 并发

MIT 协议

72KB
1K SLoC

Gemino

MPMC通道

Crates.io Documentation MIT licensed

什么是Gemino

Gemino是一种多生产者多消费者(MPMC)广播通道的实现,其中所有接收者都有机会接收到所有生产者发送的所有消息。该库在设计时考虑了速度和易用性,并提供了一种既可以是阻塞的也可以是异步的API,可以同时使用。

如果通过通道发送的数据实现了Copy,则会自动(自动)进行一些优化,这使得通道显著更快。在使用Copy时,读写操作不需要锁。可以在读取后检测到损坏的读取,从而消除锁的必要性。这与clone不同,clone需要运行依赖于通道内存中的任意代码。因此,必须使用锁来确保写入者不会覆盖正在克隆的值。虽然开销很大,但通道的整体速度仍然非常快,而且在我的非常基础的性能测试中,比其他广播通道实现要快得多。

Gemino是作为一个个人学习练习开发的,但我相信它足够好,可以分享和使用。

Gemino还处于非常早期的发展阶段,缺乏严格的测试,并使用不安全和不稳定的特性。请自行承担风险!

不稳定特性

Gemino使用了不稳定的功能 min_specialization。这是更大且目前 specialization 功能的有效子集。min_specialization 已经足够稳定,可以在标准库中使用。话虽如此,它仍然是一个不稳定的功能,需要nightly。

为什么使用Gemino?

  • 您需要同时异步和阻塞访问同一个通道。
  • 您需要多个接收者和发送者,但如果不担心接收者落后导致的数据丢失。
  • 您需要能够关闭通道,并让所有相关方都得到通知。

为什么不使用Gemino?

  • 您想避免使用不稳定nightly特性。
  • Gemino使用不安全的功能,可能表现出我们尚未看到或发现的未定义行为。
  • 如果您需要绝对保证所有接收者都能成功接收到所有消息,Gemino 可能不适合您。

基准测试

到目前为止,我只写了一些非常基础的基准测试,我肯定需要做更多的工作来更彻底、更正确地测试所有内容。

目前,我只比较了 tokio::sync::broadcastmultiqueue

在一致性方面,Gemino 比 Tokio 实现快,比 multiqueue 略快,并且比两者都要显著。一致性更高意味着 Gemino 的延迟应该比其他两个更可预测。

单线程 ns/iter +-
gemino 复制 10211 283
multiq 复制 10496 770
gemino 克隆 79118 1671
multiq 克隆 85375 2114
4个读者 4个写者
gemino 复制 368411 20533
multiq 复制 1331904 277678
gemino 克隆 1028063 75103
multiq 克隆 1137864 298458
4个读者 4个写者 异步
+ -
gemino 复制 4164023 1413060 780273
tokio 复制 7347818 1639432 1613110
gemino 克隆 7459048 3486077 326673
tokio 克隆 8323468 7026741 80843

单线程顺序

四个写线程 + 四个读线程

四个写线程 + 四个读线程 + 异步

依赖项

~0.8–6MB
~31K SLoC