在ruby中监视线程变量



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

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 "运行。执行",并且在命令类中有一个字段,称为"current_status",我想监视每X秒并检查命令状态,以便更新用户关于命令状态,我该如何做?我可能需要在一个单独的线程中运行命令,然后监视它,但是我如何监视它呢?

一种可能包含语法错误的快速而肮脏的方法: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?]

这是我在代码中使用的习惯用法。重要的是要意识到,如果状态变量没有被适当地保护以防止并发修改和访问,它们就会受到竞争条件的影响。

最新更新