class Blender::Scheduler

Attributes

events[R]
lock_properties[R]
metadata[R]
name[R]
scheduling_strategy[R]
tasks[R]

Public Class Methods

new(name, tasks = ThreadSafe::Array.new, options = {}) click to toggle source

options

noop: true/false - No-Op mode, dont invoke job.run
arguments: array or any stock data
rest everything gets merged as metadata
# File lib/blender/scheduler.rb, line 45
def initialize(name, tasks = ThreadSafe::Array.new, options = {})
  @name = name
  @tasks = tasks
  @events = Blender::EventDispatcher.new
  @config = ThreadSafe::Hash.new{ ThreadSafe::Hash.new }
  @config[:noop] = options[:noop] || false
  @config[:arguments] = options[:arguments] || []
  unless options.delete(:no_doc)
    events.register(Blender::Handlers::Doc.new)
  end
  @metadata = default_metadata.merge(options)
  @scheduling_strategy = nil
  @lock_properties = {driver: nil, driver_options: {}}
end

Public Instance Methods

blender_config(key) click to toggle source
# File lib/blender/scheduler.rb, line 115
def blender_config(key)
  @config[key]
end
concurrent_run(jobs) click to toggle source
# File lib/blender/scheduler.rb, line 87
def concurrent_run(jobs)
  c = metadata[:concurrency]
  Log.debug("Invoking concurrent run with concurrency:#{c}")
  pool = Utils::ThreadPool.new(c)
  jobs.each do |job|
    pool.add_job do
      run_job(job)
    end
  end
  pool.run_till_done
end
default_metadata() click to toggle source
# File lib/blender/scheduler.rb, line 124
def default_metadata
  temp = ThreadSafe::Hash.new
  temp[:ignore_failure] = false
  temp[:concurrency] = 0
  temp[:handlers] = ThreadSafe::Array.new
  temp[:members] = ThreadSafe::Array.new
  temp
end
run() click to toggle source
# File lib/blender/scheduler.rb, line 60
def run
  @scheduling_strategy ||= SchedulingStrategy::Default.new
  events.run_started(self)
  events.job_computation_started(scheduling_strategy)
  jobs = scheduling_strategy.compute_jobs(@tasks)
  events.job_computation_finished(self, jobs)
  lock do
    if metadata[:concurrency] > 1
      concurrent_run(jobs)
    else
      serial_run(jobs)
    end
    events.run_finished(self)
    jobs
  end
rescue StandardError => e
  events.run_failed(self, e)
  raise e
end
run_job(job) click to toggle source
# File lib/blender/scheduler.rb, line 99
def run_job(job)
  events.job_started(job)
  Log.debug("Running job #{job.name}")
  unless blender_config(:noop)
    job.run
  end
  events.job_finished(job)
rescue StandardError => e
  events.job_failed(job, e)
  if metadata[:ignore_failure]
    Log.warn("Exception: #{e.inspect} was suppressed, ignoring failure")
  else
    raise e
  end
end
serial_run(jobs) click to toggle source
# File lib/blender/scheduler.rb, line 80
def serial_run(jobs)
  Log.debug('Invoking serial run')
  jobs.each do |job|
    run_job(job)
  end
end
update_config(key, value) click to toggle source
# File lib/blender/scheduler.rb, line 119
def update_config(key, value)
  @config[key] = value
  @config
end