저는 rufus 스케줄러를 사용하여 동시에 많은 예약 된 작업을 시작하고 있습니다. 나는 일정 시간 후에 다시 실행될 때 해당 예약 된 작업에만 사용할 수있는 해당 변수를 변수에 넣기를 원합니다.일정한 시간 후에 다시 실행될 때마다 특정 예약 된 작업에 사용할 수있는 변수를 갖는 방법은 무엇입니까?
예약 된 각 작업에 대해 변수를 어떻게 유지할 수 있습니까?
저는 rufus 스케줄러를 사용하여 동시에 많은 예약 된 작업을 시작하고 있습니다. 나는 일정 시간 후에 다시 실행될 때 해당 예약 된 작업에만 사용할 수있는 해당 변수를 변수에 넣기를 원합니다.일정한 시간 후에 다시 실행될 때마다 특정 예약 된 작업에 사용할 수있는 변수를 갖는 방법은 무엇입니까?
예약 된 각 작업에 대해 변수를 어떻게 유지할 수 있습니까?
거기에는 여러 가지 방법이 있습니다. 추악한 곳에서부터 어쩐지 우아한 곳으로 가면서 그 중 일부를 자세히 설명하겠습니다.
솔루션은 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를 키로 사용하여 코드를 검색 할 수도 있습니다.
도움이되기를 바랍니다.
작업 로컬 변수가 다가오는 루퍼스 - 스케줄러에 3.0 https://github.com/jmettraux/rufus-scheduler/commit/26bc7996f9416ab8cfa70487483a5616ac8f3123 – jmettraux