Rake创建使用多任务的规则

use*_*075 2 ruby parallel-processing rake

如果我创建一个简单的规则,如

rule '.o' => ['.c'] do |t|
  sh "cc #{t.source} -c -o #{t.name}"
end
Run Code Online (Sandbox Code Playgroud)

如何告诉Rake我希望自动生成的任务可以并行化?

jcr*_*jcr 5

正如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']
Run Code Online (Sandbox Code Playgroud)

运行以下命令(非线程):

rake make_files
time rake file.1-20.ext2
Run Code Online (Sandbox Code Playgroud)

我明白了

real    0m20.232s
user    0m0.134s
sys     0m0.082s
Run Code Online (Sandbox Code Playgroud)

有5个主题:

rake clean
time rake -m -j 5 file.1-20.ext2
Run Code Online (Sandbox Code Playgroud)

我明白了

real    0m4.152s
user    0m0.122s
sys     0m0.071s
Run Code Online (Sandbox Code Playgroud)

20个主题:

rake clean
time rake -m -j 20 file.1-20.ext2
Run Code Online (Sandbox Code Playgroud)

我明白了

real    0m1.167s
user    0m0.130s
sys     0m0.065s
Run Code Online (Sandbox Code Playgroud)

我使用sleep(1)来模拟'work/io',如果你的进程阻塞很多,或者你有很多内核,这可能对你有用:)

编辑:正如Shadow在评论中指出的那样,跟随切换的"多任务"始终开启

Rake.application.options.always_multitask = true
Run Code Online (Sandbox Code Playgroud)