次のような単純なルールを作成すると
rule '.o' => ['.c'] do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
自動生成されたタスクを並列化できるようにすることを Rake に伝えるにはどうすればよいですか?
次のような単純なルールを作成すると
rule '.o' => ['.c'] do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
自動生成されたタスクを並列化できるようにすることを Rake に伝えるにはどうすればよいですか?
Dennis Rake で述べられているように、ルールはタスクとして実装されます
したがって、タスクをマルチタスクに変換する -m フラグは、ルールも「マルチルール」に変換します。
require 'rake/clean'
rule '.ext2' => '.ext1' do |t|
sh "cp #{t.source} #{t.name}"
sleep(1)
end
def dependencies(input_file)
base, is, ext = input_file.split('.')
_from, _to = is.split('-')
files = []
Integer(_from).upto(Integer(_to)) do |i|
files << "#{base}_#{i}.#{ext}"
end
return files
end
rule ".ext2" => lambda { |i| dependencies(i) } do |t|
sh "touch #{t.source}"
end
task :make_files do |t|
1.upto(20) do |i|
sh "touch file_#{i}.ext1"
end
end
CLEAN = FileList['*.ext2']
次のコマンドを実行します(スレッド化されていません):
rake make_files
time rake file.1-20.ext2
私は得る
real 0m20.232s
user 0m0.134s
sys 0m0.082s
5 つのスレッドを使用:
rake clean
time rake -m -j 5 file.1-20.ext2
私は得る
real 0m4.152s
user 0m0.122s
sys 0m0.071s
20 スレッドの場合:
rake clean
time rake -m -j 20 file.1-20.ext2
私は得る
real 0m1.167s
user 0m0.130s
sys 0m0.065s
私は sleep(1) を使用して「work/io」をエミュレートします。プロセスが多くブロックする場合、または多くのコアがある場合、これは役立つかもしれません:)
編集:コメントでシャドウが指摘したように、次のように「マルチタスク」を常にオンに切り替えます
Rake.application.options.always_multitask = true