如何终止Sidekiq的工作进程?

5
我有一个应用程序,在每次部署后需要杀死特定的Sidekiq工作进程。根据它的API建议,我可以通过从队列Sidekiq::Queue.new.clear中删除所有作业来实现。
然而,运行此命令后,工作者数量Sidekiq::Workers.new.size仍然相同。实际上,我尝试了很多方法,但都没有起作用。请帮忙!

请优雅地关闭Sidekiq进程 - aliibrahim
也许我理解不够,但我并不需要停止整个 Sidekiq 进程。相反,我想要移除特定的 worker。 - yzalavin
1
我认为这是不可能的,因为Sidekiq工作进程运行。 - aliibrahim
1
为什么需要删除工作进程?就我所了解的Sidekiq,每个工作进程都是一个预启动应用程序并等待推送到队列中的作业的进程。因此,如果队列中没有作业,则工作进程只是等待一些作业。因此,清空作业队列对于只等待作业的工作进程不会产生任何影响。正如Prashanth所回答的那样,您可以取消正在运行的作业,但我几乎可以肯定这不会删除工作进程本身。 - Jakub
谢谢解释!我需要删除 worker,因为这个 worker 实现了 Telegram 机器人的长轮询技术。每次部署之后都会启动另一个 worker 并响应两次。每次部署 - 另一个 worker。目前,我是通过终端停止 sidekiq 然后重新启动它。但我想这不是最佳实践 :) - yzalavin
@trnc Sidekiq 任务的运行时间应该是有限的,根据您的描述,看起来您需要一个后台服务,而不是 Sidekiq 任务。 - Vasfed
3个回答

8

一旦工作者开始处理作业,您就无法在不关闭整个进程的情况下从外部停止它。没有安全的方法可以停止线程。

您可以通过使工作者代码定期检查是否应该停止来向自己的代码添加停止工作者的能力,类似于作业取消


3

我没有亲自尝试过,但根据文档:

您可以将所有需要删除的工作程序添加到队列中(例如post_deploy)。

class MyWorker
  include Sidekiq::Worker
  sidekiq_options :retry => 5, :dead => false, queue: :post_deploy

  def perform()
  ...
  end
end

删除工作人员的步骤:

require 'sidekiq/api'
Sidekiq::Queue.new("post_deploy").clear

要找到队列中的作业数量,您需要按照以下方式查找。
Sidekiq::Queue.new("post_deploy").size

只需查找当前正在运行的Sidekiq线程数,您将使用Sidekiq::Worker.size。如果我误解了您的问题,请告诉我。

如果您有兴趣删除正在运行的工作人员,可以使用以下链接:https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job - Prashanth

0

简短回答。结束你的进程,然后运行这个。

Sidekiq::Queue.new("default").clear

"default" 是你的队列名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接