你如何迭代ARGV并为Ruby中的数组中的每个值创建一个Thread

时间:2016-09-21 15:52:55

标签: ruby multithreading sass compass-sass compass

我试图创建一个Ruby脚本,为ARGV中传递的每个参数启动一个单独的线程,但我无法弄清楚如何迭代它们并将它们作为常量传递给线程(或线程安全的)。类似的东西:

compile.rb

require 'rubygems'
require 'compass'
require 'compass/exec'

threads = []
ARGV.each do |arg|
  threads << Thread.new { Compass::Exec::SubCommandUI.new(["compile", arg]).run! }
end
threads.each { |thr| thr.join }

结果是它将创建预期的线程数,但每个线程将在相同的arg值上运行(循环不会按预期工作)。

我试图从Ant运行它,就像这样:

的build.xml

<java fork="true" failonerror="true" classpathref="jruby.classpath" classname="org.jruby.Main">
    <arg path="${ext.path}\compile.rb"></arg>
    <arg line="${config.rb.dirs.str}"></arg>
</java>

其中&#34; config.rb.dirs.str&#34;包含我的多个Sass项目的路径,空格分隔。

我是Ruby的新手,所以请不要判断。谢谢!

1 个答案:

答案 0 :(得分:0)

你可以运行以下并告诉我们输出吗? 您可以使用args运行它或使用脚本中指定的默认args。 它只是传递变量的两种方式(我更喜欢第二种方式)。我认为这是一个不需要任何额外的最小样本。

args = ARGV.size > 0 ? ARGV : ['arg1', 'arg2', 'arg3']

puts "args is #{args} and has size #{args.size}"
threads = args.map do |arg|
  Thread.new do
    sleep 1
    print "Arg is: #{arg}\n"
  end
end

threads.each(&:join)

puts "--"


threads = args.map do |arg|
  Thread.new(arg) do |value|
    sleep 1
    print "Arg is: #{value}\n"
  end
end

threads.each(&:join)