2016-12-24 4 views
3

私はfutures-rs MPSCキューの使用状況の簡単なexmaple記述しようとしています:シンプルなfutures :: sync :: mpsc :: channelサンプルワークの作成方法は?

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()に置き換えようとしましたが、それでも何も出力されません。そして、私はfutures-rsの文書で使用例を見つけられませんでした。私は間違って何をしていますか?

答えて

3

コンパイラが通知する警告メッセージとエラーメッセージを読むには、をお勧めします。をお勧めします。これはコンパイラで静的型付け言語の大きな利点の1つです:

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); 
    |   ^^^^^^^^^^^^^^^^^^^ 

私は先物とは専門家だが、これはすべての3つの値の警告なしでコンパイルして出力します。

extern crate futures; 

use futures::{Future, Sink, Stream, Async}; 
use futures::sync::mpsc; 
use std::thread; 

fn main() { 
    let (tx, rx) = mpsc::channel::<i32>(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は、すべてが正常に送信されるまで、生成されたスレッドをブロックするために使用されます。メソッドは、値がなくなるまでキューから値を取得するために使用されます。失敗する可能性のある方法は複数あります。私はそれらをすべて無視し、成功の場合のみに集中しています。

関連する問題