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