Class: Pindo::TaskSystem::SerialExecutionStrategy
- Inherits:
-
ExecutionStrategy
- Object
- ExecutionStrategy
- Pindo::TaskSystem::SerialExecutionStrategy
- Defined in:
- lib/pindo/module/task/core/serial_execution_strategy.rb
Overview
SerialExecutionStrategy - 串行执行策略
职责:
-
在主线程中按顺序执行所有任务
-
处理依赖关系和阻塞情况
Instance Method Summary collapse
-
#execute(task_manager) ⇒ Object
执行任务.
-
#name ⇒ String
策略名称.
Methods inherited from ExecutionStrategy
create, detect_optimal_workers
Instance Method Details
#execute(task_manager) ⇒ Object
执行任务
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 |
#name ⇒ String
策略名称
55 56 57 |
# File 'lib/pindo/module/task/core/serial_execution_strategy.rb', line 55 def name "串行执行" end |