附加到Ruby中的数组

时间:2014-01-22 18:32:32

标签: ruby parallel-processing

我试图在ruby中使用并行gem来调用数组的每个元素上的函数

require 'parallel'

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

但是,当我运行它时,结果数组总是为空。为什么不追加? 当result是红宝石Queue

时,它的行为方式相同

3 个答案:

答案 0 :(得分:2)

它不会将b / c Parallel分支附加到不再与result共享相同引用的子进程中。在这种情况下,一个选项可能是使用Parallel.map并将结果数组追加到result,即

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

答案 1 :(得分:2)

传入: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变量,而不是作为单独的进程运行。但这只是猜测。

答案 2 :(得分:1)

每个<<操作都在它自己独立的进程中发生(即并行),因此它会改变一个不同的result变量。

这是因为Parallel forks进程和分叉进程有自己的内存。