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