目前,我有一个类似于这样的 Sidekiq 工作:
class SyncUser
include Sidekiq::Worker
def perform(user_id)
#do stuff
end
end
我像这样将工作放入队列中:SyncUser.perform_async user.id
这一切当然都有效,但是在调用 perform_async 和任务实际执行之间存在一定的延迟。
是否还有其他方法可以告诉 sidekiq 立即执行任务?
目前,我有一个类似于这样的 Sidekiq 工作:
class SyncUser
include Sidekiq::Worker
def perform(user_id)
#do stuff
end
end
我像这样将工作放入队列中:SyncUser.perform_async user.id
这一切当然都有效,但是在调用 perform_async 和任务实际执行之间存在一定的延迟。
是否还有其他方法可以告诉 sidekiq 立即执行任务?
这里有两个问题。
如果你想立即执行一项工作,在当前环境下你可以使用:
SyncUser.new.perform(user.id)
如果您想减少Sidekiq工作器中异步工作被调度和执行之间的延迟,可以降低poll_interval
设置:
Sidekiq.configure_server do |config|
config.poll_interval = 2
end
poll_interval
是工作进程中的延迟时间,用于确定工作进程在队列上检查作业的频率。从作业安排到空闲工作进程执行该作业之间的平均时间将为poll_interval / 2
。
使用.perform_inline
SyncUser.perform_inline(user.id)
甚至可以在您的生产控制台中:
require 'sidekiq/testing'
Sidekiq::Testing.inline!
SyncUser.perform_inline(user.id)
对于那些通过Active Job框架使用Sidekiq的人,你可以这样做
SyncUser.perform_now(user.id)
include Sidekiq::Worker
而不是继承自 ActiveJob::Base
。 - Brendan Benson