gpt4 book ai didi

asynchronous - 如何用 future 引入特征间接?

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

我有一个 tokio tcp 服务器,它应该将单独的传入连接交给服务。我如何正确处理间接寻址以便服务器可以使用不同的服务实现?我求助于在服务内部调用 tokio::spawn(),因为我找不到一种方法来间接返回 future 。

这是我正在做的一个最小示例:

extern crate tokio;

use tokio::prelude::future::FutureResult;
use tokio::prelude::*;

struct Subject {
name: String,
}
struct MySvc {
name: String,
}
trait Svc6 {
fn handle6(&self, subject: Subject);
}
impl Svc6 for MySvc {
fn handle6(&self, subject: Subject) {
let task = future::ok((self.name.to_string(), subject))
.and_then(|(n, s)| Ok(println!("#6. Hi {}! My name is {}.", s.name, n)));
tokio::spawn(task);
}
}

#[test]
fn svc6_works() {
let svc = MySvc {
name: "Zorg".into(),
};
let subj = Subject {
name: "Gandalf".into(),
};
tokio::run(future::ok(svc).and_then(|s| Ok(s.handle6(subj))));
}

虽然这适用于间接访问,但我担心我是否正确使用了 tokio。每个 Svc6 impl 都必须调用 tokio::spawn() 而不仅仅是返回一个任务。我也更喜欢服务器是否处理生成,因为它可能需要处理优先级和排队。也很难测试不返回任何内容的方法。

这是一个 Playground 链接 the other things I've been trying .要查看完整的上下文,请转到 Samotop source和接受 fn。

如果 trait 方法实现可以返回 impl Trait 就好了!

trait Svc1 {
fn handle1(&self, subject: Subject) -> Future<Item = (), Error = ()>;
}
impl Svc1 for MySvc {
// error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
fn handle1(&self, subject: Subject) -> impl Future<Item = (), Error = ()> {
future::ok(println!(
"#1. Hi {}! My name is {}.",
subject.name, self.name
))
}
}

最佳答案

futures 或 Tokio 没有什么特别之处,这只是 Rust。我强烈建议您在深入异步编程的复杂世界之前学习如何使用基本的 Rust 功能。从 The Rust Programming Language 开始,特别是关于 trait objects 的部分:

trait Svc {
fn handle(&self, subject: Subject) -> Box<Future<Item = (), Error = ()> + Send>;
}

impl Svc for MySvc {
fn handle(&self, subject: Subject) -> Box<Future<Item = (), Error = ()> + Send> {
Box::new(future::ok(println!(
"#1. Hi {}! My name is {}.",
subject.name, self.name
)))
}
}

#[test]
fn svc_works() {
let svc = MySvc {
name: "Zorg".into(),
};
let subj = Subject {
name: "Gandalf".into(),
};
tokio::run(svc.handle(subj))
}

这被明确称为 the Tokio documentation on how to return a Future 的第一条建议.

if trait method implementation could return impl Trait!

据我所知,这是不可能的。每个返回 impl Trait 的函数都会返回一个可能不同大小的具体类型。特定的调用者不知道要为任意特征实现分配多少堆栈空间。

另见:

关于asynchronous - 如何用 future 引入特征间接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208951/

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