Tokio и связанные с ним ящики реализованы с использованием стабильного фьючерса 0.1 ящика.Черта Future
из этого ящика концептуально похожа на версию черты Future
из стандартной библиотеки, но существенно отличается в деталях.Синтаксис async
/ await
построен вокруг версии признака в стандартной библиотеке.
Выполнение поиска в Интернете по запросу «tokio async await» приводит к метко названному ящику tokio-async-await .Ниже описывается, как разрешить Tokio участвовать в нестабильных фьючерсах:
[dependencies]
tokio = { version = "0.1.15", features = ["async-await-preview"] }
tokio-process = "0.2.3"
В вашем коде вы должны выполнить преобразование между Future
, реализованным на основе характеристики из ящика фьючерсов 0.1 и из стандартной библиотеки.Простой способ сделать это - использовать Tokio-версию макроса await
:
#![feature(await_macro, async_await, futures_api)]
use std::process::Command;
use tokio_process::CommandExt;
fn main() {
tokio::run_async(main_async());
}
async fn main_async() {
let out = Command::new("echo")
.arg("hello")
.arg("world")
.output_async();
let s = tokio::await!(out);
println!("{:?}", s);
}
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/oo`
Ok(Output { status: ExitStatus(ExitStatus(0)), stdout: "hello world\n", stderr: "" })
Протестировано с:
- Rust 1.34.0-nightly (e1c6d0057 2019-02-22)
- Ржавчина 1.34.0-ночью (aadbc459b 2019-02-23)
См. также: