簡體   English   中英

紅寶石的平行性

[英]parallelism in ruby

我在我的ruby構建腳本中有一個循環,遍歷每個項目並調用msbuild並執行各種其他操作,如minify css / js。

每個循環迭代都獨立於其他循環,所以我想對它進行分析。

我該怎么做呢?

我試過了:

myarray.each{|item|
    Thread.start {

        # do stuff

     }
}
puts "foo"

但紅寶石似乎馬上退出(打印“foo”)。 也就是說,它運行在循環上,開始加載線程,但因為在each之后沒有任何東西,ruby退出殺死其他線程:(

我知道我可以做thread.join ,但如果我在循環中這樣做,那么thread.join不再平行了。

我錯過了什么?

我知道http://peach.rubyforge.org/,但使用它我得到各種奇怪的行為,看起來像我不知道如何解決的變量范圍問題:(

編輯:如果我可以在放入“foo”之前等待所有子線程執行,或者至少主ruby線程退出,這將是有用的。 這可能嗎?

謝謝

將所有線程存儲在一個數組中並循環遍歷數組調用連接:

threads = myarray.map do |item|
  Thread.start do
    # do stuff
  end
end
threads.each { |thread| thread.join }
puts "foo"

在這里使用em-synchrony :)。 纖維很可愛。

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線程是綠色線程,所以你沒有本機真正的並行性。 我想這就是你想要的,我建議你去看看JRuby和Rubinius:

http://www.engineyard.com/blog/2011/concurrency-in-jruby/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM