如何在一组工作人员完成时执行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

http://sidekiq.org/pro/

你会写这段代码:

 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付费Batchesfunction,并具有相同的API。