我正在尝试编写futures-rs mpsc队列用法的简单例子:
extern crate futures;
use futures::{Sink, Stream};
use futures::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel::<i32>(1000);
let handle = thread::spawn(move || {
tx.clone().send(1);
tx.clone().send(2);
tx.clone().send(3);
});
let mut rx = rx.map(|x| {
println!("stream: {}", x);
x * x
});
handle.join().unwrap();
rx.poll().unwrap();
}
但它不会向控制台输出任何内容(我希望它能打印stream: 1
,stream: 2
和stream: 3
)。我还尝试将rx.poll().unwrap()
替换为rx.wait()
,但它仍然没有输出任何内容。我没有在期货-rs文档中找到任何用法示例。我做错了什么?
答案 0 :(得分:4)
强烈建议读取编译器告诉您的警告和错误消息。这是使用编译器的静态类型语言的一大好处:
warning: unused result which must be used: futures do nothing unless polled, #[warn(unused_must_use)] on by default
--> src/main.rs:11:9
|
11 | tx.clone().send(1);
| ^^^^^^^^^^^^^^^^^^^
warning: unused result which must be used: futures do nothing unless polled, #[warn(unused_must_use)] on by default
--> src/main.rs:12:9
|
12 | tx.clone().send(2);
| ^^^^^^^^^^^^^^^^^^^
warning: unused result which must be used: futures do nothing unless polled, #[warn(unused_must_use)] on by default
--> src/main.rs:13:9
|
13 | tx.clone().send(3);
| ^^^^^^^^^^^^^^^^^^^
我不是期货的专家,但是这会在没有警告的情况下编译并打印所有三个值:
extern crate futures; // 0.1.23
use futures::{sync::mpsc, Async, Future, Sink, Stream};
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel(1000);
let handle = thread::spawn(move || {
tx.send(1)
.and_then(|tx| tx.send(2))
.and_then(|tx| tx.send(3))
.wait()
.expect("Unable to send");
});
let mut rx = rx.map(|x| x * x);
handle.join().unwrap();
while let Ok(Async::Ready(Some(v))) = rx.poll() {
println!("stream: {}", v);
}
}
and_then
用于在前一个值之后发送每个后续值。 wait
用于阻止生成的线程,直到所有内容都成功发送。 poll
方法用于从队列中获取值,直到它用完为止。有多种方法可能会失败,我忽略了所有方法,只关注成功案例。