监视ruby中的线程变量

时间:2014-05-01 08:33:25

标签: ruby multithreading design-patterns

我正在构建一个任务运行器,其中每个任务都是通过许多命令构建的:

def run

  begin
    #Validating task params
    set_progress "Validating params", "Validating params: #{@params}"
    validate_params

    @task_info["steps"].each do |step|
      @log.info "Running command: #{step["description"]}"

      set_progress step["description"] 

      command = Command.factory @params, step, @signature, @log
      timeout = General.in_seconds step["timeout"]

      command_res = Timeout.timeout(timeout) do
        command.execute
      end
    end 

    set_progress "Completed"
  rescue Exception => exception
    @log.error exception.message + "\nBACK TRACE:\n" + exception.backtrace.join("\n")
    set_progress @progress, "Failed, check logs. exception: #{exception.message}"
  end 

end

现在命令由" command.execute"运行,命令类中有一个字段叫做" current_status"我想监视每个X秒并检查命令状态,以便更新用户关于命令状态,我该怎么办?我可能需要在一个单独的线程中运行该命令然后监视它,但我该如何监视它?

1 个答案:

答案 0 :(得分:0)

一种快速而肮脏的方法,可能包含语法错误:P

class JobManager
  def initialize
    @threads =[]
  end

  def registered_jobs
    @registered_jobs ||= [Job1.new, Job2.new]
  end

  def start_jobs
    registered_jobs.each {|j| @threads << Thread.new { j.run } }  
  end

  def statuses?
    registered_jobs.collect {|j| j.status? }
  end
end

用法:

manager = JobManager.new

manager.start_jobs


# elsewhere

manager.statuses? # returns [Job1.status?, Job2.status?]

这是我在我的代码中使用的那种习语。重要的是要知道状态变量如果没有针对并发修改和访问进行适当防护,则会受到竞争条件的影响。