MST

星途 面试题库

面试题:JavaScript函数作为命名空间实现复杂并发场景下的优先级调度

在一个复杂的JavaScript应用场景中,有多个并发任务需要通过函数作为命名空间进行管理,且这些任务具有不同的优先级。请设计一个系统,能够根据任务优先级调度执行这些并发任务。要求详细描述设计思路,包括如何定义任务优先级、调度算法的选择及实现,并用代码示例完整展示整个系统的核心逻辑。
43.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义任务优先级
    • 可以通过给每个任务分配一个数字优先级值来定义优先级,值越大表示优先级越高。例如,高优先级任务可以设置优先级为 3,中等优先级为 2,低优先级为 1。
  2. 调度算法选择
    • 采用优先队列(Priority Queue)的思想。优先队列是一种数据结构,其中每个元素都有一个优先级,在出队操作时,具有最高优先级的元素最先出队。
    • 在 JavaScript 中,可以使用数组来模拟优先队列,通过排序操作来确保高优先级任务在队列头部。每次添加新任务时,重新排序队列以维护优先级顺序。
  3. 实现
    • 创建一个任务类 Task,用于封装任务函数及其优先级。
    • 创建一个任务调度器类 TaskScheduler,负责管理任务队列并按优先级调度任务执行。

代码示例

class Task {
    constructor(func, priority) {
        this.func = func;
        this.priority = priority;
    }
}

class TaskScheduler {
    constructor() {
        this.taskQueue = [];
    }

    addTask(task) {
        this.taskQueue.push(task);
        this.taskQueue.sort((a, b) => b.priority - a.priority);
    }

    executeTasks() {
        while (this.taskQueue.length > 0) {
            const task = this.taskQueue.shift();
            task.func();
        }
    }
}

// 使用示例
const scheduler = new TaskScheduler();

// 定义不同优先级的任务
const highPriorityTask = new Task(() => {
    console.log('高优先级任务执行');
}, 3);

const mediumPriorityTask = new Task(() => {
    console.log('中等优先级任务执行');
}, 2);

const lowPriorityTask = new Task(() => {
    console.log('低优先级任务执行');
}, 1);

// 添加任务到调度器
scheduler.addTask(highPriorityTask);
scheduler.addTask(mediumPriorityTask);
scheduler.addTask(lowPriorityTask);

// 执行任务
scheduler.executeTasks();

上述代码中:

  • Task 类用于创建任务实例,包含任务函数和优先级。
  • TaskScheduler 类负责管理任务队列,addTask 方法添加任务并重新排序队列以保持优先级顺序,executeTasks 方法按优先级顺序依次执行任务。
  • 在使用示例中,创建了不同优先级的任务并添加到调度器中执行,输出结果将按照高、中、低优先级的顺序打印。