Rails 延迟作业多线程

Rails delayed job multithreading

有什么方法可以 运行 使用延迟作业 gem 在后台并行执行相同的方法吗? 例如,我有一种方法 assign_tasks 在数据库中创建 4K 到 6K 记录,当多次调用不同对象的相同方法时,有没有办法更快地完成此执行或并行执行所有调用? 完成3到4个方法调用需要几个小时才能完成。

def assign_tasks
  #some conditions to find matched users here
  #if matched create new record for a user
  users.each do |u|
    task = Task.new(user_id: u.id)
    task.save
  end
end

@project.delay.assign_tasks

是的,使用 DelayedJob,您可以像这样向 User 模型添加一个方法

def assign_task
  Task.create(user_id: id)
end

并在您的原始方法中像这样延迟处理它:

def assign_tasks
  users.find_each { |user| user.delay.assign_task }
end

然后每个用户的任务生成将在后台发生——当有足够的工作人员时——并行。

顺便说一句,还有其他工具支持在后台处理作业——现在最常见的是 Sidekiq。它们都有稍微不同的语法和不同的依赖关系。根据您的 Ruby on Rails 版本和您的要求,您甚至可能想使用 ActiveJob 默认情况下附带 Rails。