2013-08-13 4 views
1

저는 rufus 스케줄러를 사용하여 동시에 많은 예약 된 작업을 시작하고 있습니다. 나는 일정 시간 후에 다시 실행될 때 해당 예약 된 작업에만 사용할 수있는 해당 변수를 변수에 넣기를 원합니다.일정한 시간 후에 다시 실행될 때마다 특정 예약 된 작업에 사용할 수있는 변수를 갖는 방법은 무엇입니까?

예약 된 각 작업에 대해 변수를 어떻게 유지할 수 있습니까?

답변

1

거기에는 여러 가지 방법이 있습니다. 추악한 곳에서부터 어쩐지 우아한 곳으로 가면서 그 중 일부를 자세히 설명하겠습니다.

솔루션은 rufus-scheduler 2.0.23 (https://rubygems.org/gems/rufus-scheduler)이 설치된 Debian GNU/Linux 7의 Ruby 1.9.3p392에 대해 테스트되었습니다.

당신은 전역 변수를 사용할 수 있습니다

require 'rufus-scheduler' 

scheduler = Rufus::Scheduler.start_new 

scheduler.every '1s' do 
    $counter0 ||= 0 
    $counter0 += 1 
    p [ :c0, $counter0 ] 
end 
scheduler.every '1s' do 
    $counter1 ||= 0 
    $counter1 += 1 
    p [ :c0, $counter1 ] 
end 

scheduler.join 

을 또는 당신은 하나의 전역 변수의 작업 변수를 중앙 집중화 수있다 (참고 :이 스레드로부터 안전하지 않습니다) :

require 'rufus-scheduler' 

scheduler = Rufus::Scheduler.start_new 

$job_vars = {} 

scheduler.every '1s' do |job| 
    ($job_vars[job.object_id] ||= {})['counter'] ||= 0 
    $job_vars[job.object_id]['counter'] += 1 
    p [ job.job_id, job.object_id, $job_vars[job.object_id]['counter'] ] 
end 
scheduler.every '1.5s' do |job| 
    ($job_vars[job.object_id] ||= {})['counter'] ||= 0 
    $job_vars[job.object_id]['counter'] += 1 
    p [ job.job_id, job.object_id, $job_vars[job.object_id]['counter'] ] 
end 

scheduler.join 

하나 단지 재미를 위해 추가 단계 (하지만 여전히 스레드로부터 안전하지 않습니다) :

require 'rufus-scheduler' 

scheduler = Rufus::Scheduler.start_new 

$job_vars = {} 
job = lambda { |job| 
    ($job_vars[job.object_id] ||= {})['counter'] ||= 0 
    $job_vars[job.object_id]['counter'] += 1 
    p [ job.job_id, job.object_id, $job_vars[job.object_id]['counter'] ] 
} 

scheduler.every '1s', &job 
scheduler.every '1.5s', &job 

scheduler.join 

마지막으로, 작업 C에 #vars를 추가 할 수 있습니다 lass :

require 'rufus-scheduler' 

class Rufus::Scheduler::Job 
    def vars 
    @vars ||= {} 
    end 
end 

scheduler = Rufus::Scheduler.start_new 

scheduler.every '1s' do |job| 
    job.vars['counter'] = (job.vars['counter'] || 0) + 1 
    p [ job.job_id, job.object_id, job.vars['counter'] ] 
end 
scheduler.every '1.5s' do |job| 
    job.vars['counter'] = (job.vars['counter'] || 0) + 1 
    p [ job.job_id, job.object_id, job.vars['counter'] ] 
end 

scheduler.join 

이것은 내가 선호하는 해결책입니다. rufus-scheduler 3.0 (https://github.com/jmettraux/rufus-scheduler)에서 유사한 변수 백을 Job에 추가하려고합니다.

다른 곳에 변수를 넣고 job_id/job.object_id를 키로 사용하여 코드를 검색 할 수도 있습니다.

도움이되기를 바랍니다.

+0

작업 로컬 변수가 다가오는 루퍼스 - 스케줄러에 3.0 https://github.com/jmettraux/rufus-scheduler/commit/26bc7996f9416ab8cfa70487483a5616ac8f3123 – jmettraux