如何使一个简单的期货:: sync :: mpsc :: channel示例工作?

时间:2016-12-24 20:58:32

标签: rust message-queue future

我正在尝试编写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: 1stream: 2stream: 3)。我还尝试将rx.poll().unwrap()替换为rx.wait(),但它仍然没有输出任何内容。我没有在期货-rs文档中找到任何用法示例。我做错了什么?

1 个答案:

答案 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方法用于从队列中获取值,直到它用完为止。有多种方法可能会失败,我忽略了所有方法,只关注成功案例。