我正在构建一个任务运行器,其中每个任务都是通过许多命令构建的:
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秒并检查命令状态,以便更新用户关于命令状态,我该怎么办?我可能需要在一个单独的线程中运行该命令然后监视它,但我该如何监视它?
答案 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?]
这是我在我的代码中使用的那种习语。重要的是要知道状态变量如果没有针对并发修改和访问进行适当防护,则会受到竞争条件的影响。