4个版本
0.2.4 | 2019年5月13日 |
---|---|
0.2.3 | 2019年4月30日 |
0.2.1 | 2019年3月15日 |
0.1.1 |
|
在异步中排名第1132
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