2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年6月5日 |
---|---|
0.1.0 | 2018年6月5日 |
#2042 in 异步
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