我试图创建一个Ruby脚本,为ARGV中传递的每个参数启动一个单独的线程,但我无法弄清楚如何迭代它们并将它们作为常量传递给线程(或线程安全的)。类似的东西:
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运行它,就像这样:
<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的新手,所以请不要判断。谢谢!
答案 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)