我有一个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
,工作只需几毫秒。如果我打电话给SchedulerJob.perform_later
在Sidekiq运行这个工作需要大约90秒才能完成,通过查看日志,我可以看出每个.perform_later
呼叫每个大约需要30秒。
为什么会这样?
根据定义,
perform_later
将立即执行perform
我的猜测是,当你调用perform_later
时,队列中会运行一些作业。
问题是初始化程序。 This was the solution:
我的猜测是你通过将一个全局$ REDIS连接入侵池中来破坏所有并发性。不要那样做。让Sidekiq创建和管理连接池。