2012-04-19 55 views
2

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

每個循環迭代都是獨立於其他循環的,所以我想將它們相互混淆。

我該怎麼做?

我已經試過:

myarray.each{|item| 
    Thread.start { 

     # do stuff 

    } 
} 
puts "foo" 

但紅寶石只是似乎馬上退出(版畫 「富」)。也就是說,它運行在循環,啓動線程的負載,但each,紅寶石退出殺死其他線程:(

我知道我可以做thread.join後,因爲那裏有什麼,但如果我這樣做內環路那麼它不再平行。

我缺少什麼?

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

編輯:如果我可以在放入「foo」之前等待所有子線程執行,或至少主要的ruby線程退出,那將會很有用。這可能嗎?

感謝

回答

6

存儲您所有的陣列中的線程和循環調用join:

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

線程很爛! :) – fl00r 2012-04-19 09:44:38

+0

是的,我不能說我真的很急於在Ruby應用程序中使用線程。 – Russell 2012-04-19 09:46:08

2

在這裏使用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