【问题标题】:What's the proper way to run Ruby scripts in parallel?并行运行 Ruby 脚本的正确方法是什么?
【发布时间】:2015-11-07 04:19:27
【问题描述】:

当前我有以下代码在 ruby​​ 脚本中运行一些 ruby​​ 脚本:

def run(base_directory, run_count)
  working_directory = base_directory.gsub("\n","")
  for i in 1..run_count
    system("ruby " + working_directory + i.to_s + "\\" + "main.rb " +   working_directory + i.to_s + "\\")
  end
end

但是,这会按顺序运行脚本,但我需要它们并行运行。我有 10 个脚本要运行,我想一次运行 5 个,直到达到需要运行的脚本数量。有没有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby automation


    【解决方案1】:

    刚刚发现这颗宝石parallel。您可能必须像这样运行它:

    results = Parallel.map(run_count.downto(1).to_a, :in_processes=>run_count){|i| system("ruby " + working_directory + i.to_s + "\\" + "main.rb " +   working_directory + i.to_s + "\\") }
    

    【讨论】:

    • 好吧,所以我开始使用并行,因为它似乎是最好的选择。但是我在这个堆栈轨道上遇到了障碍:gist.github.com/dgbrewer1989/12e657496818b69a6bb0 它似乎找不到 fork .. 但它已经安装了。我不确定这是 gem 问题还是 ruby​​ 问题。
    • 您是否尝试过搜索该错误?在简单的谷歌搜索“fork() function is unimplemented on this machine”后,我看到了几个关于这个错误的结果。您必须通过它们,甚至在他们的 github 帐户中打开该 gem 的问题(他们可能会将您重定向回 stackoverflow 并在此处提出该问题)。
    • 是的,我在发布后对其进行了研究,似乎这是一个 Windows 问题,Windows 不支持 fork() 命令。
    • 其实我是想问问你是不是在windows下。当我学习在 Windows 下开发 ROR 时,我遇到了很多类似的问题。从那以后,我很长时间都切换到了 Ubuntu,并且再也没有将 Windows 用于任何事情(而不是非常具体的任务)。毕竟,您将要处理的大多数服务器都是 Ubuntu。
    • @DavidBrewer:您可能会尝试在您的 Windows 服务器上安装 sygwin 并使用它运行面向 linux 的 gem。 Sygwin 是我在切换到 Ubuntu 之前在 Windows 下尝试的第二个东西,有一段时间很顺利,但最后 sygwin 也有它的局限性。
    【解决方案2】:

    不确定正确的方式是什么,但我通常只运行一个从命令行执行某些内容的单行程序:

    假设您有一个名为create_file_with_input.rb 的文件,它可以执行任何操作,例如一行:File.open("file_#{ARGV[0]}.txt", 'a')

    你可以这样做:

    run_count = 5
    
    %x(for i in `seq 0 #{run_count-1}`; do (ruby create_file_with_input.rb $i &); done)
    

    这将创建 5 个文件,例如(file_0.txt、file_1.txt、...、file_4.txt 等)。从上面调整它以适应您的代码和 BOOM。您有多个脚本正在运行。

    您也可以使用fork,尽管我没有太多的个人经验。请参阅this question(或使用 The Google)来分叉子进程。这种方式还提供了获取子进程的 PID 的好处。

    【讨论】:

    • 我对这个例子的工作原理有点困惑。 1:不确定“%x”是什么意思。 2:它从 i 循环(从 0 开始?)直到 run_count - 1 以及它在做什么 3:它是在运行 ruby​​,然后是文件名。 $i 是 for 循环中的 i 吗? & 符号是干什么用的?抱歉所有问题..我只是想了解我正在使用什么。
    • @DavidBrewer 没问题。 1.%x只是在ruby中运行系统命令的另一种方式(与反引号基本相同)。 See here 了解更多信息。 2. 是的,i 在这种情况下是从 0 循环到 4(系统 seq cmd 的循环包括在内,即它将运行 5 倍。),它与 $i 相同——你不要'不必使用它,但如果需要,可以将其传递给 ruby​​ 文件(如图所示)。 3. & 符号只是将命令从当前 shell 中分离出来(see here
    猜你喜欢
    • 2017-05-22
    • 2011-01-12
    • 2011-06-19
    • 2012-11-19
    • 2016-09-10
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多