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。
有什么方法可以 运行 使用延迟作业 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。