2014-01-22 48 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进程和分叉进程有自己的内存。