Stream
트레잇
Stream
트레잇은 Future
와 비슷하지만 작업을 끝내기 전 여러 값을 산출할 수
있다는 점에서 다릅니다. Stream
은 표준 라이브러리의 Iterator
트레잇과
비슷하다고 보면 됩니다.
trait Stream {
/// 스트림이 양보하는 값의 타입
type Item;
/// 스트림에 있는 다음 아이템을 해결하려 한다.
/// 아직 준비가 안 됐으면 `Poll::Pending`, 준비가 되었으면 `Poll::Ready(Some(x))`
/// , 끝났으면 `Poll::Ready(None)`을 반환한다.
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
-> Poll<Option<Self::Item>>;
}
Stream
의 한 가지 예시로 futures
크레이트에 있고 채널 타입에 쓰이는
Receiver
가 있습니다. Sender
단에서 값을 보낼 때마다 Some(val)
을 내놓고,
Sender
가 드랍되고 모든 대기 메시지를 다 받았을 때에는 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` 는 `Iterator::next`와 같지만,
// `Future<Output = Option<T>>`을 구현한 타입을 반환한다.
assert_eq!(Some(1), rx.next().await);
assert_eq!(Some(2), rx.next().await);
assert_eq!(None, rx.next().await);
}