在ActiveJob中排队多个任务

3

我想知道是否有一种方法可以在ActiveJob中排队多个作业?类似于sidekiq的push_bulk。

Sidekiq::Client.push_bulk(sidekiq_items)

我需要排列数千个工作,并且逐个执行太耗时了。

你尝试过在循环中排队并测量所需的时间吗? - Samer Buna
不会,但是当我排队100k个作业时需要几分钟。我应该一次排队> 1M个作业。可能的解决方案是创建一个用于排队作业的作业:)。 - Jakub Troszok
听起来你需要跳过内置的简单解决方案,使用一些更好功能的东西。 - Samer Buna
2个回答

3
您无法这样做。ActiveJob并未为每个Sidekiq特性提供抽象。

嗨,Mike!我看到你在这里做了什么;)但是我回去直接使用了Sidekiq。 - Jakub Troszok

0
截至 Rails 7,ActiveJob 还没有内置的方法可以完成这个任务,但是自己编写并不难。 (这证明了 Sidekiq 的质量和耐久性,8 年后这个问题仍然有意义!)
class ApplicationJob < ActiveJob::Base
  def self.perform_later_bulk(array_of_args)
    sidekiq_args = array_of_args.map { |args| [new(*args).serialize] }

    Sidekiq::Client.push_bulk(
      'class' => ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper,
      'wrapped' => self,
      'queue' => sidekiq_args[0][0]['queue_name'],
      'args' => sidekiq_args
    )
  end
end

def SomeJob < ApplicationJob
  def perform(arg1, arg2)
    # etc
  end
end

# Usage: SomeJob.perform_later_bulk([[arg1, arg2], [arg1, arg2], ...])

已在Rails 7上测试,但至少可以向后兼容到5.2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接