我试图在ruby中使用并行gem来调用数组的每个元素上的函数
require 'parallel'
arr = %w[one two three four five]
result ||= []
Parallel.each(arr) do |elem|
result << Random.rand(10)
end
但是,当我运行它时,结果数组总是为空。为什么不追加?
当result
是红宝石Queue
答案 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进程和分叉进程有自己的内存。