我有SchedulerJob
:
class SchedulerJob < ActiveJob::Base
queue_as :scheduler
def perform
logger.debug("Start")
DelayedJob.set(wait: 10.seconds).perform_later
logger.debug("After Job 1")
DelayedJob.set(wait: 20.seconds).perform_later
logger.debug("After Job 2")
DelayedJob.set(wait: 30.seconds).perform_later
logger.debug("End")
end
end
和DelayedJob
:
class DelayedJob < ActiveJob::Base
queue_as :delayed_jobs
def perform
puts "I'm done"
end
end
如果我呼叫SchedulerJob.new.perform
,作业将在几毫秒内完成。如果我在Sidekiq中调用SchedulerJob.perform_later
来运行该作业,则需要大约90秒才能完成,通过查看日志,我可以看出每个.perform_later
调用每个都需要大约30秒。
为什么会发生这种情况?
答案 0 :(得分:0)
根据定义,
perform_later
将立即执行perform
我的猜测是,当你拨打perform_later
时,队列中正在运行一些作业。
答案 1 :(得分:0)
问题在于初始化程序。 This was the solution:
我的猜测是你通过将一个全局$ REDIS连接入侵池中来破坏所有并发性。不要那样做。让Sidekiq创建和管理连接池。