#rust #rust-tokio
#Ржавчина #rust-tokio
Вопрос:
tokio::run_async futures 0.3 tokio::net::UnixStream
паникует.
Настройка
[package]
name = "prac"
version = "0.1.0"
edition = "2018"
[dependencies]
futures-preview = {version="0.3.0-alpha.13", features=["compat", "io-compat"]}
tokio = {version="0.1.18", features=["async-await-preview"]}
Код
#![feature(await_macro, async_await, futures_api)]
use tokio::net::UnixStream;
use tokio::net::UnixListener;
use futures::compat::Future01CompatExt;
use futures::compat::Stream01CompatExt;
use futures::StreamExt;
fn main() {
let _ = std::fs::remove_file("/tmp/test.sock");
tokio::run_async(async {
let fut = UnixListener::bind(amp;"/tmp/test.sock").unwrap().incoming().compat();
let fut = fut.for_each(|stream| {
let _ = stream;
println!("new conn");
futures::future::ready(())
});
tokio::spawn_async(fut);
let fut = UnixStream::connect(amp;"/tmp/test.sock").compat();
let _conn = await!(fut);
});
}
Выполнить
Running `target/debug/main bin main`
thread 'tokio-runtime-worker-0' panicked at 'not yet implemented: async-await-preview currently only supports futures 0.1. Use the compatibility layer of futures 0.3 instead, if you want to use futures 0.3.', /Users/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-async-await-0.1.6/src/compat/backward.rs:76:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
thread 'tokio-runtime-worker-1' panicked at 'not yet implemented: async-await-preview currently only supports futures 0.1. Use the compatibility layer of futures 0.3 instead, if you want to use futures 0.3.', /Users/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-async-await-0.1.6/src/compat/backward.rs:76:5
Компилятор заставляет меня использовать futures 0.3.
await!()
требуется futures 0.3 (не компилируется с futures 0.1)async {}
для блокировки требуется futures 0.3 (потому чтоawait!(async {})
работает)tokio::run_async
требуется futures 0.3 (не компилируется с futures 0.1)
Кажется, что futures 0.3 имеет что-то несовместимое с futures 0.1. Есть ли обходной путь?
Ответ №1:
Рабочее решение
Фрагмент кода в reddit сработал.
use futures::{Future,FutureExt};
use futures::compat::Compat;
pub fn tokio_run<F: Future<Output=()> Send 'static>(future: F) {
tokio::run(Compat::new(Box::pin(
future.map(|()| -> Result<(), ()> { Ok(()) })
)));
}
pub fn tokio_spawn<F: Future<Output=()> Send 'static>(future: F) {
tokio::spawn(Compat::new(Box::pin(
future.map(|()| -> Result<(), ()> { Ok(()) })
)));
}
Используйте фьючерсы 0.3 в await!
(не tokio::await
) и используйте эти функции вместо tokio::run_async, tokio::spawn_async
.
Нерабочее решение
В сообщении об ошибке предлагается использовать futures 0.1, но преобразование futures 0.3 в 0.1 и использование tokio::await!
не сработало:
use tokio::await;
...
await!(future03.into_awaitable());
Выполнить
thread 'tokio-runtime-worker-0' panicked at 'not yet implemented: async-await-
preview currently only supports futures 0.1. Use the compatibility layer of futures 0.3 instead, if you want to use futures 0.3.', /Users/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-async-await-0.1.6/src/compat/backward.rs:76:5
Ответ №2:
Я столкнулся с аналогичной проблемой. Я использую следующую утилиту, чтобы сделать запуск фьючерсов 0.3 в Tokio runtime:
fn compat<F: StdFuture Send 'static>(f: F) -> impl Future<Item=F::Output, Error=()> {
f.unit_error().boxed().compat()
}
Я полагаю, это тоже можно превратить в черту…