1个不稳定版本
0.1.0 | 2023年9月11日 |
---|
#772 在 异步
149 每月下载次数
在 rstreams 中使用
29KB
601 行
fork_stream
克隆任何 Stream S
,其中 <S as Stream>::Item: Clone
用法
use fork_stream::StreamExt as _;
async fn example() {
let source = futures::stream::iter(0..3);
let fork1 = source.fork();
let fork2 = fork1.clone();
assert_eq!(fork1.collect(), vec![0, 1, 2]);
assert_eq!(fork2.collect(), vec![0, 1, 2]);
}
行为
- 从源流中轮询的项目存储在缓冲区中;
- 当轮询源流的分支时,它们要么从缓冲区中产生项目的副本,要么轮询源流以获取新项目;
- 如果没有分支可以读取项目(无论是分支被丢弃,还是因为所有分支都已经产生了该项目),则丢弃项目;
- 尽可能将缓冲区中的项目移动出来而不是克隆。
- 当所有分支都丢弃时,源流被丢弃。
弱引用
任何分支都可以降级为 Weak
,稍后可以将其升级回,类似于 std::rc::Rc
或 std::sync::Arc
API。
该行为如下:
Weak
不实现Stream
并且在没有升级之前不能轮询;- 当一个
Weak
升级为一个Forked
时,结果Forked
与源流一样先进;即它不会产生任何在升级之前由其他分支产生过的事项。 - 如果在升级之前所有分叉都已被丢弃,
Weak::upgrade
返回None
。
Weak
API 在需要重用初始化成本高昂的流,同时也希望在不使用时丢弃它们时非常有用。
与 shared_stream
的不同之处
此库实现了一个类似于 shared_stream
的 API,但有一些显著的差异
依赖项
~1–1.6MB
~33K SLoC