我正在构建一个任务运行器,其中每个任务都是由许多命令构建的:
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?]
这是我在代码中使用的习惯用法。重要的是要意识到,如果状态变量没有被适当地保护以防止并发修改和访问,它们就会受到竞争条件的影响。