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 后台作业针对它们启动的同一数据库运行

如何使用 Sidekiq 运行连续的后台作业?

Rspec 如何测试 Sidekiq 作业是不是计划在特定时间运行

为啥我的 sidekiq 计划的 cron 作业没有在 heroku 上运行?

我如何使用Sidekiq运行连续的后台作业?

使用 Sidekiq 进行活动作业并获取 ActiveJob::DeserializationError