Стандартные библиотечные фьючерсы
Давайте использовать это как наш минимальный, воспроизводимый пример :
use futures::future; // 0.3.0-alpha.17
use std::future::Future;
fn example() -> impl Future<Output = i32> {
future::ready(42)
}
Вызов executor::block_on
:
fn main() {
let v = futures::executor::block_on(example());
println!("{}", v);
}
Фьючерсы 0.1
Давайте использовать это как наш минимальный, воспроизводимый пример :
use futures::{future, Future}; // 0.1.27
fn example() -> impl Future<Item = i32, Error = ()> {
future::ok(42)
}
Для простых случаев вам нужно только позвонить wait
:
fn main() {
let s = example().wait();
println!("{:?}", s);
}
Однако это сопровождается довольно серьезным предупреждением:
Этот метод не подходит для вызова циклов обработки событий или подобных ситуаций ввода / вывода, поскольку он будетпредотвратить цикл обработки событий (это блокирует поток).Этот метод следует вызывать только в том случае, если гарантируется, что работа по блокировке, связанная с этим будущим, будет завершена другим потоком.
Если вы используете Tokio, вам следует использовать Tokio Runtime::block_on
:
use tokio; // 0.1.21
fn main() {
let mut runtime = tokio::runtime::Runtime::new().expect("Unable to create a runtime");
let s = runtime.block_on(example());
println!("{:?}", s);
}
Если вы заглянете в реализацию block_on
, она фактически отправит будущий результат по каналу, а затем вызовет wait
на этом канале!Это нормально, потому что Tokio гарантирует выполнение будущего до завершения.
См. Также: