【问题标题】:Running rake multitask on another rake task in parallel在另一个 rake 任务上并行运行 rake 多任务
【发布时间】:2025-12-18 21:40:01
【问题描述】:

我正在尝试设置一个 Ruby rake 任务,我通常手动将它分成 2 个部分(即在两个单独的选项卡中运行)作为一个并行化的 rake 任务,运行为rake parallel:main 在这里看到:

namespace :parallel do
  multitask main: [:job1, :job2]

  task :job1 => :environment do
    companies = (34320..34330).to_a

    companies.each do |c|
      puts "Running on company #{c} - #{Time.now}"

      Rake::Task['parallel:my_task'].invoke("#{c}")
      Rake::Task['parallel:my_task'].reenable
    end
  end

  task :job2 => :environment do
    companies = (34340..34350).to_a

    companies.each do |c|
      puts "Running on company #{c} - #{Time.now}"

      Rake::Task['parallel:my_task'].invoke("#{c}")
      Rake::Task['parallel:my_task'].reenable
    end
  end

  task :my_task, [:c] => :environment do |t, args|
    puts "Processing #{args[:c]} - #{Time.now}"
    sleep 5
  end
end

我可以看到这些作业任务中的Time.now 是并行运行的,但基于my_task 中的Time.now 输出,我可以看到底层 rake 任务没有并行运行。

这是输出的样子:

$ rake parallel:main
Running on company 34320 - 2017-06-15 14:15:17 -0400
Running on company 34340 - 2017-06-15 14:15:17 -0400
Processing 34320 - 2017-06-15 14:15:17 -0400
Processing 34340 - 2017-06-15 14:15:22 -0400
Running on company 34321 - 2017-06-15 14:15:22 -0400
Running on company 34341 - 2017-06-15 14:15:27 -0400
Processing 34321 - 2017-06-15 14:15:27 -0400
Running on company 34342 - 2017-06-15 14:15:32 -0400
Processing 34342 - 2017-06-15 14:15:32 -0400
Running on company 34322 - 2017-06-15 14:15:32 -0400

如您所见,第一个 Processing 发生在 14:15:17,第二个发生在 14:15:22,基于睡眠。我希望这些同时运行 - 我该如何实现?

【问题讨论】:

    标签: ruby-on-rails ruby parallel-processing rake


    【解决方案1】:

    对,我刚刚了解到invoke 执行依赖项,但它只执行尚未调用的任务(source)。

    因此,我将代码更改为以下内容,并且效果很好: Rake::Task['parallel:my_task'].execute :c => c

    【讨论】: