lib/fasten/runner.rb in fasten-0.8.0 vs lib/fasten/runner.rb in fasten-0.8.4

- old
+ new

@@ -176,21 +176,21 @@ ui.force_clear end end def show_error_tasks - task_error_list.each do |task| + tasks.failed.each do |task| log_info "task: #{task} error:#{task.error}\n#{task.error&.backtrace&.join("\n")}" end end def raise_error_in_failure return unless tasks.failed? show_error_tasks - message = "Stopping because the following tasks failed: #{task_error_list.map(&:to_s).join(', ')}" + message = "Stopping because the following tasks failed: #{tasks.failed.map(&:to_s).join(', ')}" if developer ui.cleanup puts message @@ -203,22 +203,24 @@ raise message end end def remove_workers_as_needed - while workers.count > jobs - return unless (worker = workers.find { |item| item.running_task.nil? }) + workers.group_by(&:class).each do |_clazz, worker_list| + while worker_list.count > jobs + break unless (worker = workers.find { |item| item.running_task.nil? }) - worker.kill - workers.delete worker + worker.kill + workers.delete worker - ui.force_clear + ui.force_clear + end end end - def find_or_create_worker - worker = workers.find { |item| item.running_task.nil? } + def find_or_create_worker(worker_class: ) + worker = workers.find { |item| item.class == worker_class && item.running_task.nil? } unless worker @worker_id = (@worker_id || 0) + 1 worker = worker_class.new runner: self, name: "#{worker_class.to_s.gsub('::', '-')}-#{format '%02X', @worker_id}", use_threads: use_threads worker.start @@ -232,12 +234,16 @@ worker end def dispatch_pending_tasks while tasks.waiting? && tasks.running.count < jobs - worker = find_or_create_worker - task = tasks.next + + task_worker_class = task.worker_class || worker_class + task_worker_class = Object.const_get(task_worker_class) if task_worker_class.is_a? String + + worker = find_or_create_worker worker_class: task_worker_class + log_ini task, "on worker #{worker}" worker.send_request_to_child(task) tasks.running << task ui.force_clear