我Resque工人階級Resque工作,如何停止正在運行的任務
class WebWorker
@queue = :jobs_queue
def self.perform(id)
//bunch of code here
end
end
我從隊列中刪除某項工作這樣
Resque.dequeue(WebWorker,id)
但我想停止正在運行的任務並重新啓動,我該怎麼做?
我Resque工人階級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工人目前正在做要停止作業。並殺死孩子的孩子進程。像殺害工人的孫子過程。
說明:
一名工人叉子進程中執行函數來運行其代碼。如果我們直接殺死這個子進程,那麼這個工作將停止,但它會被標記爲失敗的工作。這就是爲什麼我們在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
http://stackoverflow.com/questions/7416318/how-do-i-clear-stuck-stale-resque-workers – snowangel