[英]Resque jobs, how to stop running job
我的Resque工人班
class WebWorker
@queue = :jobs_queue
def self.perform(id)
//bunch of code here
end
end
我從隊列中刪除了這樣的某個工作
Resque.dequeue(WebWorker,id)
但是我想停止運行並重新啟動,我該怎么做?
嘗試unregister_worker
如下:
Resque.workers.each(&:unregister_worker)
此命令將停止工作並將其設置為失敗。
http://www.rubydoc.info/gems/resque/Resque/Worker:unregister_worker
如果你想殺死/停止正在進行的工作而不將其標記為失敗的工作,你可以使用這個黑客。
class Task
@queue = :queue_name
def self.perform(parameters)
pid = Process.fork do
Task.work parameters
end
#puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
end
def self.work(parameters)
#Your perform code here
end
end
現在,您希望停止此代碼,只需訪問當前正在執行您要停止的作業的resque工作人員。 並殺死孩子的孩子過程。 像殺死工人的孫子過程之類的東西。
說明:
一個worker分叉子進程,其中perform函數運行其代碼。 如果我們直接殺死此子進程,則此作業將停止,但它將被標記為失敗的作業。 這就是為什么我們在self.perform中分叉了另一個子進程,現在kill執行的子進程將停止這個正在運行的作業,並且它也不會被標記為失敗。 現在我們可以再次排隊。 因此,任務是如何聯系到我們需要停止工作的工人(._。“)
我已經設法通過為基於UNIX的系統編寫此代碼來完成此操作:
Resque.workers.each do |worker|
#If condition : "current worker is working and is working on the job that we want to stop and is operating on the queue that we require " and please change this condition as per your requirement
if worker.working? and worker.queues.include?("queue_name") and worker.job["payload"]["args"].first==post_id
victim = %x[pgrep -P #{worker.pid}] #Getting child's PID
victim.strip!
victim = %x[pgrep -P #{victim}] #Getting grandchild's PID of worker
victim.strip!
%x[kill -9 #{victim.to_i}]
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.