2014-01-22 50 views
0

數組我試圖使用並行寶石紅寶石調用數組追加到Ruby的

require 'parallel' 

arr = %w[one two three four five] 
result ||= []  
Parallel.each(arr) do |elem| 
    result << Random.rand(10) 
end 

但是,當我運行它,結果數組總是空的每個元素的功能。爲什麼不附加? 它的行爲相同的方式,當result是紅寶石Queue

+0

'arr'是一個數組'%w [一二三四五]'。編輯問題。 –

回答

1

傳遞一個:in_threads選項:

require 'parallel' 

arr = %w[one two three four five] 
result ||= [] 
Parallel.each(arr, :in_threads => 8) do |elem| 
    result << Random.rand(10) 
end 

不要問我詳細解釋這個;我只是在瀏覽Parallel項目的源代碼,並將其視爲一種可能性,並嘗試了它。

我的猜測是它告訴線程以線程運行,以便它們可以共享result變量,而不是作爲單獨的進程運行。但這只是一個猜測。

+0

我最終使用了這個,':in_threads'設置爲'arr.count' –

2

它並不B/C Parallel叉追加到不再共享相同的參考result子進程。在這種情況下,一種選擇可能是使用Parallel.map和結果數組追加到result,即

result ||= []  
result += Parallel.map(arr) { |elem| Random.rand(10) } 
1

每個<<操作發生在其自己的獨立過程中(即並行),因此它會變換不同的result變量。

發生這種情況的原因是Parallelforks進程和分叉進程有自己的內存。