【问题标题】:Append to an array in Ruby附加到Ruby中的数组
【发布时间】:2014-01-23 02:57:26
【问题描述】:

我正在尝试使用 ruby​​ 中的并行 gem 对数组的每个元素调用一个函数

require 'parallel'

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

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

【问题讨论】:

  • arr 是一个数组 %w[one two three four five]。编辑问题。

标签: ruby parallel-processing


【解决方案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 变量,而不是作为单独的进程运行。但这只是猜测。

【讨论】:

  • 我最终使用了这个,:in_threads 设置为 arr.count
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    每个&lt;&lt; 操作都在其自己的单独进程中发生(即并行),因此它正在改变一个不同的result 变量。

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

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多