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 并发
72KB
1K SLoC
Gemino
MPMC通道
什么是Gemino
Gemino是一种多生产者多消费者(MPMC)广播通道的实现,其中所有接收者都有机会接收到所有生产者发送的所有消息。该库在设计时考虑了速度和易用性,并提供了一种既可以是阻塞的也可以是异步的API,可以同时使用。
如果通过通道发送的数据实现了Copy,则会自动(自动)进行一些优化,这使得通道显著更快。在使用Copy时,读写操作不需要锁。可以在读取后检测到损坏的读取,从而消除锁的必要性。这与clone不同,clone需要运行依赖于通道内存中的任意代码。因此,必须使用锁来确保写入者不会覆盖正在克隆的值。虽然开销很大,但通道的整体速度仍然非常快,而且在我的非常基础的性能测试中,比其他广播通道实现要快得多。
Gemino是作为一个个人学习练习开发的,但我相信它足够好,可以分享和使用。
Gemino还处于非常早期的发展阶段,缺乏严格的测试,并使用不安全和不稳定的特性。请自行承担风险!
不稳定特性
Gemino使用了不稳定的功能 min_specialization
。这是更大且目前 specialization
功能的有效子集。min_specialization
已经足够稳定,可以在标准库中使用。话虽如此,它仍然是一个不稳定的功能,需要nightly。
为什么使用Gemino?
- 您需要同时异步和阻塞访问同一个通道。
- 您需要多个接收者和发送者,但如果不担心接收者落后导致的数据丢失。
- 您需要能够关闭通道,并让所有相关方都得到通知。
为什么不使用Gemino?
- 您想避免使用不稳定nightly特性。
- Gemino使用不安全的功能,可能表现出我们尚未看到或发现的未定义行为。
- 如果您需要绝对保证所有接收者都能成功接收到所有消息,Gemino 可能不适合您。
基准测试
到目前为止,我只写了一些非常基础的基准测试,我肯定需要做更多的工作来更彻底、更正确地测试所有内容。
目前,我只比较了 tokio::sync::broadcast 和 multiqueue。
在一致性方面,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