在 ActiveJob 中排队多个作业

问题描述 投票:0回答:3

我想知道是否有办法在 ActiveJob 中将多个作业排队? 类似于 sidekiq Push_bulk。

Sidekiq::Client.push_bulk(sidekiq_items)

我需要对数千个作业进行排队,并且一项一项地完成需要花费太多时间。

ruby-on-rails ruby-on-rails-4 sidekiq rails-activejob
3个回答
3
投票

你不能。 ActiveJob 并没有对每个 Sidekiq 功能进行抽象。


0
投票

从 Rails 7 开始,ActiveJob 中仍然没有内置方法来实现此目的,但您可以很容易地自行实现。 (这个问题在 8 年后仍然具有现实意义,这证明了 Sidekiq 的质量和耐用性!)

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。


0
投票

对于 Rails >=7.1,您可以使用

ActiveJob.perform_all_later
:

class MyJob < ApplicationJob
  def perform(model)
    model.do_stuff
  end
end

jobs = MyModel.my_scope.map { |model| MyJob.new(model) }
ActiveJob.perform_all_later(jobs)

我使用 ActiveRecord 模型作为此示例的参数,但它可以是任何东西。

文档

© www.soinside.com 2019 - 2024. All rights reserved.