2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年6月5日
0.1.0 2018年6月5日

#2042 in 异步

MIT/Apache

11KB
127

可完成的未来

类似于Java的CompletableFuture,这个crate提供了一种简单的事件,可以从事件的其他地方完成并正确通知,而不是从事件执行器处。它适合某些可能会阻塞执行器的阻塞任务。

CompletableFuture仍然是一个事件,具有您可以使用来链式调用逻辑的所有组合器,用于处理结果或错误。此外,与Java不同,它继承自Rust的poll模型事件,某些执行器需要执行CompletableFuture以获取结果;完成(或错误)事件的线程或代码将不会执行事件之后链式调用的逻辑。

CompletableFuture使用Arc和Mutex来同步poll和完成,因此使用它会有一些开销。

示例

extern crate futures;
extern crate completable_future;

use futures::prelude::*;
use futures::executor::block_on;
use std::thread::spawn;
use std::thread::sleep;
use std::time::Duration;

let fut1 = CompletableFuture::<String, ()>::new();
// we will give the signal to some worker for it to complete
let mut signal = fut1.signal(); 
let fut2 = fut1.and_then(|s| {
    // this will come from whoever completes the future
    println!("in fut2: {}", s);
    Ok("this comes from fut2".to_string())
});

let j = spawn(move || {
    println!("waiter thread: I'm going to block on fut2");
    let ret = block_on(fut2).unwrap();
    println!("waiter thread: fut2 completed with message -- {}", ret);
});

spawn(move || {
    println!("worker thread: going to block for 1000 ms");
    sleep(Duration::from_millis(1000));
    signal.complete("this comes from fut1".to_string());
    println!("worker thread: completed fut1");
});

j.join().unwrap();

依赖项

~1MB
~15K SLoC