2013-11-20 69 views
8

我Resque工人階級Resque工作,如何停止正在運行的任務

class WebWorker 

    @queue = :jobs_queue 

    def self.perform(id) 
    //bunch of code here 
    end 
end 

我從隊列中刪除某項工作這樣

Resque.dequeue(WebWorker,id) 

但我想停止正在運行的任務並重新啓動,我該怎麼做?

+1

http://stackoverflow.com/questions/7416318/how-do-i-clear-stuck-stale-resque-workers – snowangel

回答

1

如果你覺得殺/停止正在進行的工作,而不將其標記爲失敗的作業,你可以使用這個技巧。

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 
相關問題