buildExecutionOrder method

List<List<PreloadTask>> buildExecutionOrder()

构建任务执行顺序(Kahn 拓扑排序) 返回按层级分组的任务列表,同一层级的任务可以并发执行

Implementation

List<List<PreloadTask>> buildExecutionOrder() {
  final inDegree = <String, int>{};
  final queue = Queue<String>();

  // 初始化入度
  for (final task in tasks) {
    inDegree[task.id] = task.dependencies
        .where((d) => _taskMap.containsKey(d))
        .length;
  }

  // 入度为0的任务可以立即执行
  for (final task in tasks) {
    if (inDegree[task.id] == 0) {
      queue.add(task.id);
    }
  }

  final result = <List<PreloadTask>>[];
  var remainingTasks = tasks.length;

  while (queue.isNotEmpty) {
    final levelTasks = <PreloadTask>[];

    final currentLevel = queue.length;
    for (var i = 0; i < currentLevel; i++) {
      final taskId = queue.removeFirst();
      final task = _taskMap[taskId]!;
      levelTasks.add(task);

      // 减少依赖此任务的任务的入度
      for (final otherTask in tasks) {
        if (otherTask.dependencies.contains(taskId)) {
          inDegree[otherTask.id] = (inDegree[otherTask.id] ?? 0) - 1;
          if (inDegree[otherTask.id] == 0) {
            queue.add(otherTask.id);
          }
        }
      }
    }

    if (levelTasks.isNotEmpty) {
      levelTasks.sort(
        (a, b) => b.config.priority.compareTo(a.config.priority),
      );
      result.add(levelTasks);
    }

    remainingTasks -= levelTasks.length;
  }

  if (remainingTasks > 0) {
    throw CircularDependencyException(['存在未解决的依赖关系']);
  }

  return result;
}