How to pass different arguments in rake multitask

雨燕双飞 提交于 2019-12-06 05:57:21

Extract the functionality into its own method (foo) and dynamically declare rake tasks with the arguments (arg1,arg2) baked into the task name itself. Then declare a multitask and invoke it. All calls to foo will be run in parallel.

def foo(arg1, arg2)
  thread_id = Thread.current.object_id.to_s[-4..-1]
  10.times do |i|
    sleep rand
    puts "[#{thread_id}] (#{arg1}) (#{arg2}) (#{i})"
  end
end

task :parallel_foos do
  arg1s = (1..4).map { sprintf('%.4f', rand) }
  arg2s = %w{red green blue yellow}
  arg_pairs = arg1s.zip(arg2s)
  # dynamically declare unique rake tasks
  arg_pairs.each do |arg_pair|
    task arg_pair.to_s do
      foo(*arg_pair)
    end
  end
  multitask :_parallel_foos => arg_pairs.map(&:to_s)
  Rake::MultiTask[:_parallel_foos].invoke
end

>> rake parallel_foos
[2460] (0.4510) (blue) (0)
[4820] (0.5997) (yellow) (0)
[4820] (0.5997) (yellow) (1)
[2980] (0.3482) (red) (0)
[2980] (0.3482) (red) (1)
[2100] (0.2251) (green) (0)
[2980] (0.3482) (red) (2)
[4820] (0.5997) (yellow) (2)
[2460] (0.4510) (blue) (1)
[2980] (0.3482) (red) (3)
[4820] (0.5997) (yellow) (3)
[2100] (0.2251) (green) (1)
[2980] (0.3482) (red) (4)
[2100] (0.2251) (green) (2)
[2460] (0.4510) (blue) (2)
[2100] (0.2251) (green) (3)
[4820] (0.5997) (yellow) (4)
[2460] (0.4510) (blue) (3)
[2980] (0.3482) (red) (5)
[4820] (0.5997) (yellow) (5)
[2460] (0.4510) (blue) (4)
[2980] (0.3482) (red) (6)
[2100] (0.2251) (green) (4)
[2460] (0.4510) (blue) (5)
[4820] (0.5997) (yellow) (6)
[2100] (0.2251) (green) (5)
[2980] (0.3482) (red) (7)
[2460] (0.4510) (blue) (6)
[4820] (0.5997) (yellow) (7)
[2980] (0.3482) (red) (8)
[2100] (0.2251) (green) (6)
[4820] (0.5997) (yellow) (8)
[2460] (0.4510) (blue) (7)
[2100] (0.2251) (green) (7)
[2980] (0.3482) (red) (9)
[2460] (0.4510) (blue) (8)
[4820] (0.5997) (yellow) (9)
[2460] (0.4510) (blue) (9)
[2100] (0.2251) (green) (8)
[2100] (0.2251) (green) (9)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!