无法执行tokio :: boxed Future,因为绑定了Send的特征不满足

时间:2018-07-23 18:48:02

标签: rust rust-tokio

我有一个函数,根据参数的不同,应该可以选择将来运行还是不执行任何操作。我尝试在将要返回的两个期货周围放置一个Box,一个立即解析为tokio::prelude::future::Done<Item=(), Error=()>的{​​{1}},以及一个我正在使用{{1} }和Ok(()),将tokio::timer::Delayand_then都变成map_err。当我尝试使用Item运行期货时,这似乎对我不起作用。

Error

这无法编译并显示以下错误消息:

()

看来tokio::run没有实现extern crate tokio; use std::time::{Duration, Instant}; use tokio::prelude::*; use tokio::timer; fn main() { tokio::run(foo(12)); } fn foo(x: i32) -> Box<Future<Item = (), Error = ()>> { if x == 0 { Box::new( timer::Delay::new(Instant::now() + Duration::from_secs(5)) .and_then(|_| Ok(())) .map_err(|_| ()), ) } else { Box::new(future::result(Ok(()))) } } ,这对我来说没有意义。由于我要返回的error[E0277]: the trait bound `tokio::prelude::Future<Error=(), Item=()>: std::marker::Send` is not satisfied --> src/main.rs:8:5 | 8 | tokio::run(foo(12)); | ^^^^^^^^^^ `tokio::prelude::Future<Error=(), Item=()>` cannot be sent between threads safely | = help: the trait `std::marker::Send` is not implemented for `tokio::prelude::Future<Error=(), Item=()>` = note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique<tokio::prelude::Future<Error=(), Item=()>>` = note: required because it appears within the type `std::boxed::Box<tokio::prelude::Future<Error=(), Item=()>>` = note: required by `tokio::run` 类型都实现了Box<Future...>,因此在我看来Send应该如此,因为Future是stdlib中的自动实现。我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

我意识到我需要在Foo的返回类型中指定将来为Send。编译:

extern crate tokio;

use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer;

fn main() {
    tokio::run(foo(12));
}

fn foo(x: i32) -> Box<Future<Item = (), Error = ()> + Send> { // note the + Send at the end of this line
    if x == 0 {
        Box::new(
            timer::Delay::new(Instant::now() + Duration::from_secs(5))
                .and_then(|_| Ok(()))
                .map_err(|_| ()),
        )
    } else {
        Box::new(future::result(Ok(())))
    }
}