我有一个 tokio tcp 服务器,它应该将单个传入连接传递给服务。如何正确处理间接,以便服务器可以使用不同的服务实现?我求助于tokio::spawn()
在服务内部调用,因为我找不到间接返回未来的方法。
这是我正在做的一个最小示例:
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()
而不是仅仅返回一个任务。如果服务器处理生成,我也更喜欢它,因为它可能需要处理优先级和排队。也很难测试不返回任何内容的方法。
这是我一直在尝试的其他事情的游乐场链接。要查看完整的上下文,请转到Samotop 源和接受 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
))
}
}