2017-06-15 266 views
0

我试图设置一个Ruby rake任务,我通常将其作为一个并行化的rake任务手动拆分为两部分(即在两个单独的选项卡中运行),运行时为rake parallel:main在另一个rake任务中并行运行rake multitask

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并行运行,但基于Time.now输出从内部my_task我可以看到下面的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分十七秒,第二个在14点15分22秒,根据睡眠。我希望这些可以同时运行 - 我该如何实现这一目标?

回答

0

对,我刚刚得知invoke执行依赖关系,但它只在任务没有被调用时执行(source)。

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