簡體   English   中英

Ruby on Rails Sidekiq的工人執行順序

[英]Ruby on Rails Sidekiq order of workers execution

我有與Sidekiq后台工作者一起使用的Rails應用程序

MyWorker1.perform_async(param_1)
MyWorker1.perform_async(param_2) 
MyWorker1.perform_async(param_3)
MyWorker1.perform_async(param_4)

MyWorker2.perform_async(param_5) 

如何使MyWorker2僅在所有MyWorker1完成工作后才能執行?

你可以使用GUSH

class SimpleworkFlow < Gush::Workflow
   run MyWorker1, params: {param_1}
   run Myworker1, params: {param_2}
   run MyWorker1, params: {param_3}
   run MyWorker1, params: {param_4}
   run Myworker2, params: {param_5}, after: MyWorker1
end

出於調試目的,您可以可視化

bundle exec gush viz SampleWorkflow

然后簡單的步驟

flow = SampleWorkflow.new
flow.save 

然后開始工作

bundle exec gush workers

然后開始工作流程

flow.start!

無論你為它付出,並使用Sidekiq與親

class CallNextJob
  def on_success(status, options)
    MyWorker2.perform_async(options[:bundle])
  end
end

params = [param1, param2, param3, param4]
batch = Sidekiq::Batch.new
batch.on(:success, CallNextJob, bundle: param5)
batch.jobs do
  params.each {|param| MyWorker1.perform_async(param)}
end
puts "Just started Batch #{batch.bid}"

或者,您只需在每個作業的末尾保存完成狀態,然后在每個MyWorker1完成時將MyWorker2入隊:

# Worker1
def heavy_load(job_id)
  # do the load
  ...
  # save state
  WorkerReport.create(worker_id: job_id)
end

class WorkerReport < ActiveRecord::Base
  after_commit :do_next

  private

  # It's important to do that in after_commit block to evade strange bugs
  # When you create next job here, you are absolutely sure that
  # current WorkerReport is already saved to base
  def do_next
    # Check if other Worker1 jobs from current bundle are finished
    if self.where(...).exists?
      Worker2.perform_async(...)
    end
  end
end

也許您可以保留Worker1結果的結果,並在最后檢查結果是否完整。 如果您有一個完整的結果,那么是否比從worker1啟動worker2?

MyWorker1.perform_async(param_1)-> {done:false},

MyWorker1.perform_async(param_2)-> {done:false},

MyWorker1.perform_async(param_3)-> {done:false},

MyWorker1.perform_async(param_4)-> {done:true},

MyWorker1->如果結果完成? MyWorker2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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