Rust 如何在另一个任务中生成一个长时间运行的Tokio任务而不阻塞父任务?

Rust 如何在另一个任务中生成一个长时间运行的Tokio任务而不阻塞父任务?,rust,rust-tokio,Rust,Rust Tokio,我试图构造一个对象,它可以管理来自websocket的提要,但可以在多个提要之间切换 有一个Feed特征: trait提要{ 异步fn启动(&mut self); 异步fn停止(&mut self); } 有三个结构实现了Feed:A、B和C 调用start时,它会启动一个无限循环,监听来自websocket的消息,并在消息传入时处理每个消息 我想实现一个FeedManager,它维护一个活动提要,但可以接收命令来切换它使用的提要源 enum命令{ 开始(字符串), 停止 } 结构FeedMa

我试图构造一个对象,它可以管理来自websocket的提要,但可以在多个提要之间切换

有一个
Feed
特征:

trait提要{
异步fn启动(&mut self);
异步fn停止(&mut self);
}
有三个结构实现了
Feed
A
B
C

调用
start
时,它会启动一个无限循环,监听来自websocket的消息,并在消息传入时处理每个消息

我想实现一个
FeedManager
,它维护一个活动提要,但可以接收命令来切换它使用的提要源

enum命令{
开始(字符串),
停止
}
结构FeedManager{
活动馈送句柄:tokio::task::JoinHandle,
控制器:mpsc::接收器,
}
impl FeedManager{
异步fn启动(&self){
而让一些(命令)=self.controller.recv()等待{
匹配命令{
FeedCommand::Start(提要类型)=>{
//以某种方式告诉活动提要停止(可能需要通道)或终止任务?
如果feed_type==“A”{
//用消耗馈源a的新tokio任务替换活动馈源任务
}否则,如果馈送类型==“B”{
//用消耗馈源B的新tokio任务替换活动馈源任务
}否则{
//用消耗馈源C的新tokio任务替换主动馈源任务
}
}
}
}
}
}
我正在努力理解如何正确管理所有的东京任务
FeedManager
的核心循环是永远监听传入的新命令,但它需要能够在不阻塞的情况下生成另一个长期任务(这样它就可以监听命令)

我的第一次尝试是:

如果提要类型==“A”{
self.active\u feed\u handle=tokio::spawn(异步{
A::new().start().wait;
});
自激活\u进给\u手柄。等待
}
  • 句柄上的
    .await
    将导致核心循环不再接受命令,对吗
  • 我可以省略最后一个
    。等待
    并让任务继续运行吗
  • 我是否需要以某种方式清理当前活动的任务

一种方法是使用Tokio的宏,它接受多个期货并等待所有期货。您可以创建多个期货并加入!()将它们放在一起,共同等待它们。

我可以生成一个长时间运行的Tokio任务,而无需通过生成任务来阻止父任务-这是任务存在的主要原因。如果您不等待任务,那么您就不会等待任务:

使用std::time::Duration;
使用tokio::{task,time};//1.3.0
#[tokio::main]
异步fn main(){
任务::生成(异步){
时间:睡眠(持续时间:从秒(100))。等待;
爱普林顿(
“你可能永远也看不到这个印刷品\
已退出,因为父任务已退出\
整个计划也是如此。”
);
});
}
另见:


您希望来自非活动源的消息发生什么变化?他们是否应该永远排队,或者如果当前没有人在听,他们是否应该被丢弃,或者其他什么?当提要停止时,它将关闭websocket,因此它应该停止存在。很难回答您的问题,因为它不包括一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢值得注意的是,您的代码没有使用有效的Rust语法-。