版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

代码块
 let s = stream::new();
 while let some(future) = s.await { // await 触发 next_poll 调用,有 future 则返回,没 future 则挂起等待
   let result = future.await;  //  触发 poll,若返回 pending,则挂起
   println!(result);
 }

(待补充图)Image Added

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