是否可以狙击或取消特定的Sidekiq工作者/正在运行的作业 - 有效地在工作线程中调用异常或其他内容来终止它。
我在Sidekiq(最新)下有一些相当简单的背景ruby(MRI 1.9.3)工作,这些工作运行正常,并且依赖于外部系统。外部系统可能需要不同的时间,在此期间工人必须保持可用。
我想我可以使用Sidekiq的API来找到合适的工作人员 - 但是我没有在文档中看到任何'terminate / cancel / quite / exit'方法 - 这可能吗?这是其他人做过的吗?
聚苯乙烯。我知道我可以在worker工作中使用异步循环来捕获相关信号并将其自身关闭..但由于外部系统的性质,这会使事情变得复杂。
答案 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