设计思路
- 定义
AsyncTask
特征:包含一个异步执行方法 execute
,所有需要调度执行的任务类型都要实现这个特征。
- 定义
TaskQueue<T>
泛型类型:T
限定为实现了 AsyncTask
特征的类型。该类型内部使用一个队列来存储任务。
- 实现
schedule
方法:将任务添加到队列中,并按顺序异步执行这些任务。在执行过程中,使用 futures
库来管理异步操作,利用 tokio
等运行时来实际执行异步任务。通过 Result
类型来处理异步操作可能产生的错误。
关键代码片段
use std::collections::VecDeque;
use futures::future::Future;
use tokio::task::spawn;
// 定义 AsyncTask 特征
pub trait AsyncTask {
async fn execute(&self) -> Result<(), Box<dyn std::error::Error>>;
}
// 定义 TaskQueue 泛型类型
pub struct TaskQueue<T>
where
T: AsyncTask,
{
tasks: VecDeque<T>,
}
impl<T> TaskQueue<T>
where
T: AsyncTask,
{
// 构造函数
pub fn new() -> Self {
TaskQueue {
tasks: VecDeque::new(),
}
}
// 将任务添加到队列
pub fn enqueue(&mut self, task: T) {
self.tasks.push_back(task);
}
// 按顺序异步执行任务
pub async fn schedule(&mut self) {
while let Some(task) = self.tasks.pop_front() {
match spawn(task.execute()).await {
Ok(Ok(())) => (),
Ok(Err(e)) => eprintln!("Task execution error: {}", e),
Err(e) => eprintln!("Task spawn error: {}", e),
}
}
}
}
示例使用
// 示例任务类型
struct ExampleTask;
impl AsyncTask for ExampleTask {
async fn execute(&self) -> Result<(), Box<dyn std::error::Error>> {
println!("Executing ExampleTask");
Ok(())
}
}
#[tokio::main]
async fn main() {
let mut task_queue = TaskQueue::<ExampleTask>::new();
task_queue.enqueue(ExampleTask);
task_queue.schedule().await;
}