Sidekiq 停止一项正在运行的作业
Posted
技术标签:
【中文标题】Sidekiq 停止一项正在运行的作业【英文标题】:Sidekiq stop one single, running job 【发布时间】:2014-11-11 10:31:13 【问题描述】:所以我需要以编程方式停止 Sidekiq (3.1.2) 中的运行作业,而不是预定的作业。我确实阅读了 API 文档,但并没有真正找到有关取消正在运行的作业的任何信息。使用 sidekiq 可以做到这一点吗?
当这不可能直接实现时,我的想法是通过在调用信号时在作业中引发异常,然后从重试集中删除作业来规避这一点。但这显然不是最优的。
提前致谢
【问题讨论】:
那你是怎么解决这个问题的?你能分享一下你的解决方法吗? 查看第一个答案中的常见问题解答,它很好地解释了这个想法。我通过向执行操作添加多个断点(即在每个块的开头)做了类似的事情。这在很大程度上取决于您的用例,您想在哪里/何时停止执行您的 perform 方法 【参考方案1】:如果您知道长时间运行的作业的线程 ID,则可以从另一个任务中终止它:
class ThreadLightly
include Sidekiq::Worker
def perform(tid)
puts "I'm %s, and I'll be terminating TID: %s..." % [self.class, tid]
Thread.list.each |t|
if t.object_id.to_s == tid
puts "Goodbye %s!" % t
t.exit
end
end
end
你可以从sidekiq_pusher触发它:
bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID
您需要记录每个作业的 Thread.current.object_id,因为 UI 不显示它。此外,如果您运行分布式 sidekiqs,则需要运行此任务,直到它在同一实例上运行。
【讨论】:
正是我要找的!一点点更正:此时(2017)你应该使用object_id.to_s(36)
。【参考方案2】:
正确,停止作业的唯一方法是让作业自行停止。您的应用程序必须实现该逻辑。
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
【讨论】:
您能详细说明一下吗?我不知道如何自己停止工作 哇,我实际上实现了类似于这个版本的东西,通过使用 Redis 并将所有 jid 存储在哈希中,然后在我的 perform 方法中添加断点,每次检查当前 jid 是否设置在 redis 中跨度> 任何反对杀死线程,如另一个答案中所建议的,当需要中断工作时? 如果那个方法是安全的,你不认为 Sidekiq 会允许它吗?以上是关于Sidekiq 停止一项正在运行的作业的主要内容,如果未能解决你的问题,请参考以下文章
如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行
Rspec 如何测试 Sidekiq 作业是不是计划在特定时间运行