...
代码块 |
---|
let s = stream::new(); while let some(future) = s.await { // await 触发 next_poll 调用,有 future 则返回,没 future 则挂起等待 let result = future.await; // 触发 poll,若返回 pending,则挂起 println!(result); } |
(待补充图)
iter 函数 和 buffered 函数
...
由 Generator 返回,对 future 进行了封装,可以获得 future 的 handle,与 TaskState 不同的是,TaskState 是用于批量执行子任务的,而 TaskFuture<Output> 更像是一个单独的 future 封装。
UML
...
从精简的伪代码理解
代码块 |
---|
impl TaskState for MyTaskState {
// FutureTaskStream<S> 的 poll_next 中会调用,并拉起 future 异步流程, 调用 future 的poll
// 检查 future 的返回值,最后调用 next 生成新的 TaskState(当然也可能重试,边角逻辑不再赘述)
fn new_sub_task(&self) -> future {
let fut = async {
do_something_in_async(); // 业务代码
};
fut
}
// 前一个结束,则后一个开始,返回新的 TaskState对象
fn next(self) -> Self {
match self.result {
A_result => AnotherMyTaskStateA::new()
B_result => AnotherMyTaskStateB::new()
}
}
}
let state = MyTaskState::new();
// 交给 TaskGenerator 跑异步流程
let generator = TaskGenerator<MyTaskState, MyTaskStateOutputCollect>::generate(state);
generator.await; // 初始化 stream,buffered,放入 sink 中异步执行 stream 的 TaskState 返回的 future |