6 个版本 (3 个重大更新)
新版本 0.4.2 | 2024 年 8 月 9 日 |
---|---|
0.4.1 | 2024 年 8 月 8 日 |
0.3.0 | 2024 年 7 月 21 日 |
0.2.0 | 2024 年 7 月 20 日 |
0.1.0 | 2024 年 6 月 26 日 |
#1 在 #consuming
每月 672 次下载
在 3 crate 中使用
265KB
4K SLoC
UFOTOFU
Ufotofu 提供了用于懒加载生成或消费任意长度序列的 API。Ufotofu 的亮点包括
- 在整个序列处理支持的各个模式下保持一致的错误处理语义,
- 例如,流与读取器之间有意义的子类型关系,
- 错误类型或项目类型没有不必要的专业化,
- 同步和异步代码的完全类似 API,
- 能够链式使用不同类型的序列,以及
nostd
支持。
您可以在这里阅读 API 设计的深入讨论。
核心抽象
Ufotofu 是围绕一组描述如何逐项生成或消费序列项的小型特质层次结构构建的。
Producer
为某些客户端代码提供序列的项,类似于 futures::Stream
或 core::iter::Iterator
特质。客户端代码可以反复请求下一个项,并收到另一个项、一个错误或一个专用 final 项,该项可能与其重复项的类型不同。对应于 T
的 iterator 等同于具有 ()
最终项类型和 !
错误类型的 T
的 producer。
一个 Consumer
接受来自某些客户端代码的序列项,类似于 futures::Sink
特性。客户端代码可以反复向序列添加新项,直到它添加一个单个的 最终 项,这个最终项可能与重复项的类型不同。类型为 ()
的最终项使添加最终项等同于调用传统的 close
方法。
生产者和消费者是完全对偶的;pipe 函数将尽可能多的数据从生产者写入消费者。
消费者通常在执行对数据的副作用之前,如将数据写入网络之前,先在内部队列中缓冲项。 BufferedConsumer
特性扩展了 Consumer
特性,允许客户端代码触发内部缓冲区的有效刷新。对偶地,BufferedProducer
特性扩展了 Producer
特性,允许客户端代码触发数据到内部缓冲区的有效预取。
最后,BulkProducer
和 BulkConsumer
特性分别扩展了 BufferedProducer
和 BufferedConsumer
,使它们能够一次操作整个项的切片,类似于 std::io::Read
和 std::io::Write
。 bulk_pipe 函数利用这种能力有效地传输数据——与标准库的 Read 和 Write 特性不同,这不需要分配辅助缓冲区。
软件包组织
ufotofu 软件包分为三个高级模块
sync
提供了同步、阻塞抽象的 API(类似于core::iter::Iterator
),local_nb
提供基于Future
的、非阻塞 API(类似于futures::stream::Stream
)用于 单线程 执行器,以及nb
提供基于Future
的、非阻塞 API,用于 多线程 执行器。
所有三个模块实现了相同的概念;唯一的区别是函数是否是异步的,如果是的话,是否实现Send
。特别是,每个模块都有自己的版本,用于与序列交互的核心特质。
nb
模块缺少 sync
和 local_nb
模块的大多数功能,但核心特质定义是有的,并且我们乐于接受 pull-requests。
功能标志
Ufotofu 在功能标志后面隐藏了只有在某些情况下才有趣的特征。然而,这些 API 文档记录了 所有 功能,就像所有功能标志都被激活了一样。
所有依赖 Rust 标准库的功能都在 std
功能标志后面(默认启用)。
所有执行动态内存分配的功能都在 alloc
功能标志后面(默认禁用)。
所有帮助测试和开发的功能都在 dev
功能标志后面(默认禁用)。
许可证
根据您的选择,此软件受Apache License, Version 2.0或MIT 许可证的许可。除非您明确声明,否则您有意提交以包含在此软件包中的任何贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,而不添加任何额外条款或条件。
该项目通过 NGI0 Core 基金获得资助,该基金由 NLnet 建立,并由欧洲委员会的 Next Generation Internet 项目提供资金支持,在 DG Communications Networks, Content and Technology 的监督下,根据资助协议 No 101092990。
依赖项
~225KB