【问题标题】:How to execute Rake file tasks in parallel如何并行执行 Rake 文件任务
【发布时间】:2021-05-15 22:03:35
【问题描述】:

我正在使用 Rake 构建 C 语言构建系统。 编译多个文件时, 我想使用 CPU 的多个内核并行编译多个文件。

你能给我一些关于如何编写 Rake 文件的建议吗? 我想在 Rake 中实现make -j

作为一个限制,我不想安装新的 Gem。

为清楚起见,这里是一个简化的 Rake 文件。

CC = "gcc"

task :default => "hello"

file "hello" => ["hello.o", "message.o"] do
  sh "#{CC} -o hello hello.o message.o"
end

file "hello.o" => "hello.c" do (1)
  sh "#{CC} -c hello.c"
end

file "message.o" => "message.c" do (2)
  sh "#{CC} -c message.c"
end

对于任务,我可以使用多任务。 但是,对于文件任务,我不知道如何描述它。 我想同时运行文件任务 (1) 和 (2)。

我的环境: ruby 2.6.4p104(2019-08-28 修订版 67798)[i386-cygwin]

提前谢谢你。

【问题讨论】:

    标签: build rake rakefile


    【解决方案1】:

    我发现 rake -m 将所有任务都视为多任务处理。我仅为不想并行执行的任务定义了单独的任务。通过指定“rake -m -j 8”之类的内容,我确认构建时间减少了。

    【讨论】:

      【解决方案2】:

      您可以创建线程,也可以在新线程中运行文件。

      例如

      CC = "gcc"
      
      task :default => "hello"
      
      file "hello" => ["hello.o", "message.o"] do
        Thread.new do
          sh "#{CC} -o hello hello.o message.o"
        end
      end
      
      file "hello.o" => "hello.c" do
        Thread.new do
          sh "#{CC} -c hello.c"
        end
      end
      
      file "message.o" => "message.c" do
        Thread.new do
          sh "#{CC} -c message.c"
        end
      end
      

      【讨论】:

      • 感谢您的回答。我错过了基础知识。我现在就试试。
      • 执行“hello.o”和“message.o”后,必须执行“hello”。这将导致链接错误。我可以使用 join 或其他方法来同步它们吗?如果我有一个大的 rakefile,同步可能会很复杂。有什么好办法吗?
      猜你喜欢
      • 2018-06-08
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多