gpt4 book ai didi

rust - 使用动态类型对象实现 `tokio::io::AsyncWrite`

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

我是 Rust 的新手,所以我可能遗漏了一些明显的东西。

这段代码工作正常:

pub fn say_hello() {
let fut = tokio::io::write_all(tokio::io::stdout, "Hello, world!").then(|_| {});
tokio::run(fut);
}

而下面的代码编译失败:

pub fn say_hello(w: Box<dyn tokio::io::AsyncWrite>) {
let fut = tokio::io::write_all(w, "Hello, world!").then(|_| {});
tokio::run(fut);
}

编译错误是:

error[E0277]: `dyn tokio_io::async_write::AsyncWrite` cannot be sent between threads safely

有什么方法可以完成我想要的(实际上是动态调度,而不仅仅是使函数通用)。

最佳答案

TL;DR tokio::run expects 实现 Send 的 Future 也在 '静态 生命周期。

如果您向参数添加所需的限制,它将与 Stdout 一样工作:

pub fn say_hello(w: Box<dyn tokio::io::AsyncWrite + Send + 'static>) {
let fut = tokio::io::write_all(w, "Hello, world!").then(|_| Ok(()));

tokio::run(fut);
}

注意:Stdout 有效是因为 Stdout implementations已经包含 Send,并且它是封闭范围的拥有数据。


但是 Rust 如何知道 write_all 创建的 Future 是否是 Send

使用 AsyncWrite 的实现调用 write_all 是可以的,因为 tokio::io::write_all期望实现 AsyncWrite。但是tokio::run期望一个 owned'static Future 实现 Send

您正在尝试运行 WriteAll future ,但请检查此 Send implementationWriteAll 上,它仅在TA 实现Send 时实现Send。在你的例子中,T 是你的 buf 类型,它是 &'static str,它是 implements Send和AAsyncWrite的实现。

在此定义中,没有声明 w 是一个 Send(或者它有一个 'static/owned 生命周期):

pub fn say_hello(w: Box<dyn tokio::io::AsyncWrite>) 

这就是为什么 tokio run 不接受 WriteAll Future 的原因。

关于rust - 使用动态类型对象实现 `tokio::io::AsyncWrite`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56994758/

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