我正在尝试设置一个Ruby rake任务,我通常手动将其分为两部分(即在两个单独的选项卡中运行)作为一个并行化的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
是并行运行的,但是根据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:17,第二个发生在14:15:22,基于睡眠。我想让它们同时运行 - 我怎样才能实现这个目标?
答案 0 :(得分:0)
是的,我刚刚了解到invoke
执行了依赖项,但它只执行了尚未调用的任务(source)。
所以我将代码更改为以下内容并且效果很好:
Rake::Task['parallel:my_task'].execute :c => c