簡體   English   中英

Resque作業,如何停止運行作業

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM