5

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

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

我想我可以使用 Sidekiq 的 API 来找到合适的工作人员——但我在文档中没有看到任何“终止/取消/相当/退出”方法——这可能吗?这是其他人做过的事情吗?

附言。我知道我可以在工作人员工作中使用异步循环来捕获相关信号并自行关闭......但是由于外部系统的性质,这会使事情变得有点复杂。

4

1 回答 1

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
于 2015-07-05T09:22:32.983 回答