Class: Pindo::TaskSystem::SerialExecutionStrategy

Inherits:
ExecutionStrategy show all
Defined in:
lib/pindo/module/task/core/serial_execution_strategy.rb

Overview

SerialExecutionStrategy - 串行执行策略

职责:

  • 在主线程中按顺序执行所有任务
  • 处理依赖关系和阻塞情况

Instance Method Summary collapse

Methods inherited from ExecutionStrategy

create, detect_optimal_workers

Instance Method Details

#execute(task_manager) ⇒ Object

执行任务

Parameters:

  • 任务管理器



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/pindo/module/task/core/serial_execution_strategy.rb', line 14

def execute(task_manager)
  queue = task_manager.queue
  checker = task_manager.dependency_checker
  executor = task_manager.executor
  resource_manager = task_manager.resource_lock_manager

  # 主循环:按顺序执行所有任务
  while !queue.pending_empty?
    # 先检查依赖(不在锁内)
    pending_tasks = queue.pending_snapshot
    executable_task = pending_tasks.find { |t| checker.dependencies_satisfied?(t) }

    unless executable_task
      # 检查是否所有任务都因依赖问题无法执行
      if checker.all_pending_blocked?
        Funlog.warning("所有剩余任务都因依赖问题无法执行")
        break
      end

      # 没有可执行的任务,短暂休眠后重试
      sleep(0.1)
      next
    end

    # 原子操作:查找并获取资源锁
    task = queue.find_and_remove do |t|
      # 只检查是否是刚才找到的任务,并尝试获取资源
      t.id == executable_task.id &&
        resource_manager.try_acquire(t.required_resources, t.id)
    end

    # 如果获取失败(资源被占用),继续循环
    next unless task

    # 执行任务
    executor.execute_task_sync(task, task_manager)
  end
end

#nameString

策略名称

Returns:



55
56
57
# File 'lib/pindo/module/task/core/serial_execution_strategy.rb', line 55

def name
  "串行执行"
end