Метод perform_now
является оберткой для метода perform
класса ActiveJob::Execution
.Исходный код (сокращенный для ответа) для обоих этих методов можно найти здесь, на GitHub .Исходный код выглядит следующим образом:
module ActiveJob
module Execution
extend ActiveSupport::Concern
include ActiveSupport::Rescuable
# Includes methods for executing and performing jobs instantly.
module ClassMethods
# Method 1
def perform_now(*args)
job_or_instantiate(*args).perform_now
end
end
# Instance method. Method 2
def perform_now
self.executions = (executions || 0) + 1
deserialize_arguments_if_needed
run_callbacks :perform do
perform(*arguments)
end
rescue => exception
rescue_with_handler(exception) || raise
end
# Method 3
def perform(*)
fail NotImplementedError
end
MyJob.perform_now Этот вызов вызывает метод класса perform_now
(метод 1 во фрагменте), который внутренне создает экземпляр объектаMyJob
и вызывает метод экземпляра perform_now
(метод 2 во фрагменте).Этот метод десериализует аргументы при необходимости, а затем запускает обратные вызовы, которые мы, возможно, определили в нашем файле задания для MyJob
.После этого он вызывает метод perform
(метод 3 в нашем фрагменте), который является методом экземпляра класса ActiveJob::Execution
.
MyJob.new.perform Если мы используемВ этой записи мы в основном сами создаем экземпляр задания, а затем вызываем метод perform
(метод 3 нашего фрагмента).Таким образом, мы пропускаем десериализацию, предоставляемую perform_now
, а также пропускаем любые обратные вызовы, написанные на нашей работе, MyJob
.
Иллюстрируется на примере:
# app/jobs/my_job.rb
class UpdatePrStatusJob < ApplicationJob
before_perform do |job|
p "I'm in the before perform callback"
end
def perform(*args)
p "I'm performing the job"
end
end
MyJob.perform_now
дает вывод:
"I'm in the before perform callback"
"I'm performing the job"
, тогда как MyJob.new.perform
дает вывод:
"I'm performing the job"
Эта статья Кароля Галанчака подробно объясняет работу и должна быть интересной, если вам нужна дополнительная информация о работе.