ruby中的并行性

ruby中的并行性,ruby,multithreading,Ruby,Multithreading,我的ruby构建脚本中有一个循环,循环遍历每个项目,调用msbuild,并执行各种其他操作,如minify css/js 每个循环迭代都是独立于其他循环的,所以我想将其并行化 我该怎么做 我试过: myarray.each{|item| Thread.start { # do stuff } } puts "foo" 但ruby似乎马上就退出了(打印“foo”)。也就是说,它在循环中运行,启动一个线程负载,但是由于每个之后都没有任何内容,ruby退出时会杀

我的ruby构建脚本中有一个循环,循环遍历每个项目,调用msbuild,并执行各种其他操作,如minify css/js

每个循环迭代都是独立于其他循环的,所以我想将其并行化

我该怎么做

我试过:

myarray.each{|item|
    Thread.start {

        # do stuff

     }
}
puts "foo"
但ruby似乎马上就退出了(打印“foo”)。也就是说,它在循环中运行,启动一个线程负载,但是由于
每个
之后都没有任何内容,ruby退出时会杀死其他线程:(

我知道我可以执行
thread.join
,但是如果我在循环中执行此操作,那么它就不再是并行的

我错过了什么

我知道,但使用它,我会得到各种奇怪的行为,这些行为看起来像变量范围问题,我不知道如何解决:(

编辑:如果我可以等待所有子线程执行,然后再放入“foo”,或者至少主ruby线程退出,这将非常有用。这可能吗


谢谢

考虑到ruby线程是绿色线程,所以你没有真正的并行性。如果这是你想要的,我建议你看看JRuby和Rubinius:


将所有线程存储在一个数组中,并通过调用join的数组进行循环:

threads = myarray.map do |item|
  Thread.start do
    # do stuff
  end
end
threads.each { |thread| thread.join }
puts "foo"
在这里使用:)。纤维很可爱

require "em-synchrony"
require "em-synchrony/fiber_iterator"

# if you realy need to get a Fiber per each item
# in real life you could set concurrency to, for example, 10 and it could even improve performance
# it depends on amount of IO in your job
concurrency = myarray.size
EM.synchrony do
  EM::Synchrony::FiberIterator.new(myarray, concurrency).each do |url|
    # do some job here
  end
  EM.stop
end

是的,我不能说我真的急于在Ruby应用程序中使用线程。