Streams
优质
小牛编辑
133浏览
2023-12-01
Stream
trait 类似于Future
,但可以在完成之前,yield 多个值,类似于标准库的 Iterator
trait:
trait Stream {
/// The type of the value yielded by the stream.
type Item;
/// Attempt to resolve the next item in the stream.
/// Retuns `Poll::Pending` if not ready, `Poll::Ready(Some(x))` if a value
/// is ready, and `Poll::Ready(None)` if the stream has completed.
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
-> Poll<Option<Self::Item>>;
}
一个Stream
的常见例子是,这个Receiver
用于futures
箱子的 channel 类型。它会在每次Sender
端发送一个值,都会 yield Some(val)
,并且一旦Sender
被 dropped 和接收到了所有 pending 消息,就会 yield None
:
async fn send_recv() {
const BUFFER_SIZE: usize = 10;
let (mut tx, mut rx) = mpsc::channel::<i32>(BUFFER_SIZE);
tx.send(1).await.unwrap();
tx.send(2).await.unwrap();
drop(tx);
// `StreamExt::next` is similar to `Iterator::next`, but returns a
// type that implements `Future<Output = Option<T>>`.
assert_eq!(Some(1), rx.next().await);
assert_eq!(Some(2), rx.next().await);
assert_eq!(None, rx.next().await);
}