首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tokio::run_async与tokio::net::UnixStream恐慌

tokio::run_async与tokio::net::UnixStream恐慌
EN

Stack Overflow用户
提问于 2019-04-01 03:11:35
回答 2查看 453关注 0票数 2

tokio::run_async + futures 0.3 + tokio::net::UnixStream恐慌。

设置

代码语言:javascript
复制
[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"]}

代码

代码语言:javascript
复制
#![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(&"/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(&"/tmp/test.sock").compat();
        let _conn = await!(fut);
    });
}

代码语言:javascript
复制
     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

编译器强迫我使用期货0.3。

  1. await!()要求期货0.3 (不编译期货0.1)
  2. async {}块需要期货0.3 (因为await!(async {})工作)
  3. tokio::run_async要求期货0.3 (不编译期货0.1)

看来期货0.3与期货0.1有一些不相容之处。有解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-01 17:16:19

工作溶液

reddit中的代码片段起作用了。

代码语言:javascript
复制
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(()) })
    )));
}

await! (而不是tokio::await)中使用fusion0.3,并使用这些函数而不是tokio::run_async, tokio::spawn_async

非工作溶液

错误消息建议使用期货0.1,但将期货0.3转换为0.1并使用tokio::await!无效:

代码语言:javascript
复制
use tokio::await;
...
await!(future03.into_awaitable());

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-05-16 15:01:00

我遇到了一个类似的问题。我正在使用以下实用工具,以便在Tokio运行时上运行0.3期货:

代码语言:javascript
复制
fn compat<F: StdFuture + Send + 'static>(f: F) -> impl Future<Item=F::Output, Error=()> {
    f.unit_error().boxed().compat()
}

我想它也会变成一种特征..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55447650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档