#async #stream #future #generator #gen #own #generator-based

nightly gen-stream

基于生成器的Rust和futures 0.3流

4个版本

0.2.4 2019年5月13日
0.2.3 2019年4月30日
0.2.1 2019年3月15日
0.1.1 2019年3月7日

异步中排名第1132

MIT/Apache

10KB
114 代码行

gen-stream

基于生成器的Rust和futures 0.3流。

文档

这有什么用?

Rust生态系统目前正在向基于Future特性和相关技术的异步计算发展。这其中包括使我们能够使用async/await以同步方式编写基于Futures的代码。

但是这仅适用于Future。如何编写复杂的异步迭代器(即Stream)而不使用基于枚举的状态机?async yield函数有望最终为我们提供帮助。但在那时之前...

只需编写自己的生成器并将其包装在GenStream之一中。

如何使用它?

您需要最新的Rust nightly,测试表明在nightly-2019-03-02上可以正常工作。

将以下内容添加到Cargo.toml中

gen-stream = "0.2"

示例

#![feature(async_await)]
#![feature(never_type)]
#![feature(generators)]
#![feature(generator_trait)]
#![feature(gen_future)]

use futures::{
    compat::*,
    prelude::*,
    task::Poll,
};
use gen_stream::{gen_await, GenPerpetualStream};
use std::{ops::Generator, time::{Duration, SystemTime}};
use tokio::{runtime::current_thread::Runtime, timer::Interval};

fn current_time() -> impl Generator<Yield = Poll<SystemTime>, Return = !> {
    static move || {
        let mut i = Interval::new_interval(Duration::from_millis(500)).compat();

        loop {
            let _ = gen_await!(i.next()).unwrap().unwrap();

            yield Poll::Ready(SystemTime::now());
        }
    }
}

fn main() {
    let mut time_streamer = GenPerpetualStream::from(Box::pin(current_time()));

    let mut rt = Runtime::new().unwrap();
    rt.spawn(Compat::new(async move {
        for _ in 0..3 {
            let current_time = time_streamer.next().await;
            println!("Current time is {:?}", current_time);
        }

        Ok(())
    }.boxed()));
    rt.run();
}

许可证:MIT/Apache-2.0

依赖项

~53KB