MST

星途 面试题库

面试题:Rust闭包在异步回调函数中的深度应用

使用Rust的`async - await`和闭包,实现一个异步任务队列。要求有一个`TaskQueue`结构体,包含`push_task`方法用于将异步任务(以闭包形式)加入队列,`execute`方法用于按顺序异步执行队列中的任务。每个任务模拟一个网络请求,通过`async_std::task::sleep`模拟延迟,并且任务间可能有数据依赖(例如后一个任务需要前一个任务的执行结果)。请详细实现`TaskQueue`结构体及其方法,并在主函数中进行测试。
33.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use async_std::task;
use std::collections::VecDeque;

struct TaskQueue {
    tasks: VecDeque<Box<dyn FnMut() -> impl std::future::Future<Output = ()>>>,
}

impl TaskQueue {
    fn new() -> Self {
        TaskQueue {
            tasks: VecDeque::new(),
        }
    }

    fn push_task(&mut self, task: impl FnMut() -> impl std::future::Future<Output = ()> + 'static) {
        self.tasks.push_back(Box::new(task));
    }

    async fn execute(&mut self) {
        while let Some(mut task) = self.tasks.pop_front() {
            task().await;
        }
    }
}

#[async_std::main]
async fn main() {
    let mut queue = TaskQueue::new();

    let mut data = 0;

    queue.push_task(move || {
        async move {
            task::sleep(std::time::Duration::from_secs(1)).await;
            data += 1;
            println!("Task 1 executed, data: {}", data);
        }
    });

    queue.push_task(move || {
        async move {
            task::sleep(std::time::Duration::from_secs(1)).await;
            data *= 2;
            println!("Task 2 executed, data: {}", data);
        }
    });

    queue.execute().await;
}