Rust 如何在另一个任务中生成一个长时间运行的Tokio任务而不阻塞父任务?
我试图构造一个对象,它可以管理来自websocket的提要,但可以在多个提要之间切换 有一个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
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
- 我可以省略最后一个
。等待
并让任务继续运行吗
- 我是否需要以某种方式清理当前活动的任务
使用std::time::Duration;
使用tokio::{task,time};//1.3.0
#[tokio::main]
异步fn main(){
任务::生成(异步){
时间:睡眠(持续时间:从秒(100))。等待;
爱普林顿(
“你可能永远也看不到这个印刷品\
已退出,因为父任务已退出\
整个计划也是如此。”
);
});
}
另见: