2013-08-13 4 views
1

Я запускаю много запланированных заданий в то же время, используя планировщик rufus. Я хочу, чтобы в этом коде была переменная, которая будет доступна только для этого запланированного задания, когда она снова запустится через некоторое время.Как получить переменную, которая будет доступна для конкретной запланированной задачи, когда она снова запустится через некоторое время?

Как я могу поддерживать переменную для каждой запланированной работы?

ответ

1

есть несколько способов сделать это. Я расскажу о некоторых из них, от уродливых до элегантных.

Решения, протестированные против Ruby 1.9.3p392 на Debian GNU/Linux 7 с rufus-scheduler 2.0.23 (https://rubygems.org/gems/rufus-scheduler).

Вы можете использовать глобальную переменную:

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 

One шаг дальше, просто для удовольствия (но не поточно-):

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 

Наконец, вы можете добавить #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 

Это решение, которое я предпочитаю. Я намерен добавить подобный пакет переменных в Job в rufus-scheduler 3.0 (https://github.com/jmettraux/rufus-scheduler).

Вы также можете поместить переменную в другое место и использовать job_id/job.object_id в качестве ключа для ее получения (как это делают первые штрихи кода).

Надеюсь, это поможет.

+0

с работой локальной переменные в течение предстоящего Руфуса-планировщиком 3,0 https://github.com/jmettraux/rufus-scheduler/commit/26bc7996f9416ab8cfa70487483a5616ac8f3123 – jmettraux

 Смежные вопросы

  • Нет связанных вопросов^_^