gpt4 book ai didi

rust - 无法 tokio::run 盒装 Future,因为不满足特征绑定(bind) Send

转载 作者:行者123 更新时间:2023-11-29 08:29:31 27 4
gpt4 key购买 nike

<分区>

我有一个函数,可以根据参数选择运行 future 或什么也不做。我试着放一个 Box围绕将返回的两个 future ,一个tokio::prelude::future::Done<Item=(), Error=()>立即解析为 Ok(()) , 和一个 tokio::timer::Delay我正在使用 and_thenmap_errItemError() .当我尝试使用 tokio::run 运行 future 时,这似乎对我不起作用.

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我要返回的类型都实现了 Send , 在我看来 Box应该,因为impl Send for Box<T> where T: Send是标准库中的一个自动工具。我在这里缺少什么?

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com