1 个不稳定版本
0.1.1 | 2023年2月10日 |
---|---|
0.1.0 |
|
39 在 #mpsc 中
773 每月下载量
在 3 个crate中使用(2 直接使用)
23KB
282 行
scroll-ring
MPSC 文本流结构体
此 crate 提供的数据结构旨在满足在损耗网络上的 stdout 风格文本流的需求,这导致以下要求
- 在无 std/no-alloc 缓冲区中存储字节数据流
- 多生产者(以便线程或甚至信号/中断可以写入它)
- 永不阻塞(处理数据的调用可能需要 O(n) 的时间,但即使有大量的读写,它也不应该显著更长——理想情况下是常数时间,但考虑到原子操作通常不是常数时间的,可能是“尽可能快”吗?)
- 不交错连续写入
- 不丢失任何写入(可以接受溢出,但需要跟踪有多少字节溢出)
- 尽可能长时间保留旧数据,直到它被覆盖
- 当写入速度远远慢于当前写入时,给读者一个获取合理数据块的机会(想想获取数据滚动的快照)
- 尽可能少地溢出。
溢出的数据甚至可能不会进入缓冲区,例如当写入的切片大于缓冲区时,或者当(大量)数据在读取发生时写入,或者在慢速进程写入时——无论是哪种情况,写入的字节都会被计数,只是不可读(就像如果读者只是太慢一样)。
这是仅基于“尽可能少地溢出”的最小实现,以便获得一个非常简单的实现。更好的选择是
-
完美的实现将在每个地方都使用原子操作,只要没有读取(或没有从低优先级线程写入,这些低优先级线程的写入在低优先级写入完成 memcpy 之前就绕过了高优先级写入),就不会有溢出。这将是最理想的,但非常困难。
-
中间的实现将允许并行写入,但会在操作开始和停止时短暂锁定数据结构的行政部分。(因此,溢出可能只是因为中断在不适时触发了)。
这两种版本都可能需要一些有效字节的位字段(或忙碌写入器的列表),因为由于线程优先级的可变性,并发写入不会按照开始时的相反顺序完成。
-
目前提供的是最简单的版本。在整个读取或写入过程中,数据结构都保持锁定状态,任何溢出都会记录在锁定的结构旁边的原子字段中。
这里使用的是单线程模式的 [ringbuf] 数据结构;还有一个多线程模式,可以部分实现其他版本。
许可:MIT OR Apache-2.0
依赖项
~250KB