如何在一组工作人员完成时执行Sidekiq回调
假设我有一个Sidekiq任务,可以将产品处理到我的数据库。 每个产品都按商店分组,所以我的代码的一个过于简化的例子就是这样……
stores.each do |store| store.products.each do |product| ProductWorker.perform_async(product.id) end end
当一家商店的所有产品都运行时。 我想用当前时间更新商店last_updated
列。 但只有当该商店的最后一个任务运行时。 我怎样才能做到这一点?
这正是Sidekiq Pro的批次function旨在解决的问题:
https://github.com/mperham/sidekiq/wiki/Batches
你会写这段代码:
class ProductWorker include Sidekiq::Worker def on_complete(status, params) Store.find(params['sid']).update_attribute(:last_updated, Time.now) end def perform(product_id) # do something end end stores.each do |store| b = Sidekiq::Batch.new b.on(:complete, ProductWorker, 'sid' => store.id) b.jobs do store.products.find_each do |product| ProductWorker.perform_async(product.id) end end end
简单。
您可以尝试使用sidekiq-batch
gem来解决您的问题。 这就像Sidekiq Pro
付费Batches
function,并具有相同的API。