有没有办法狙击或终止特定的sidekiq工人?

时间:2013-07-03 12:55:56

标签: ruby jobs terminate worker sidekiq

是否可以狙击或取消特定的Sidekiq工作者/正在运行的作业 - 有效地在工作线程中调用异常或其他内容来终止它。

我在Sidekiq(最新)下有一些相当简单的背景ruby(MRI 1.9.3)工作,这些工作运行正常,并且依赖于外部系统。外部系统可能需要不同的时间,在此期间工人必须保持可用。

我想我可以使用Sidekiq的API来找到合适的工作人员 - 但是我没有在文档中看到任何'terminate / cancel / quite / exit'方法 - 这可能吗?这是其他人做过的吗?

聚苯乙烯。我知道我可以在worker工作中使用异步循环来捕获相关信号并将其自身关闭..但由于外部系统的性质,这会使事情变得复杂。

1 个答案:

答案 0 :(得分:0)

异步循环是最好的方法,因为sidekiq无法终止正在运行的作业。

def perform
  main_thread = Thread.new do
    ActiveRecord::Base.connection_pool.with_connection do
      begin
        # ...
      ensure
        $redis.set some_thread_key, 1
      end
    end
  end

  watcher_thread = Thread.new do
    ActiveRecord::Base.connection_pool.with_connection do
      until $redis.del(some_thread_key) == 1 do
        sleep 1
      end
      main_thread.kill
      until !!main_thread.status == false do
        sleep 0.1
      end
    end
  end

  [main_thread, watcher_thread].each(&:join)
end