【问题标题】:Ruby parallel sortingRuby 并行排序
【发布时间】:2015-03-06 08:24:20
【问题描述】:

我正在尝试创建排序算法的多线程版本。我不明白为什么这个算法总是只返回 Array[1] 而不是完整的数组。

class Array
  def quick_sort
    return self if self.length <= 1
    pivot = self[0]
    if block_given?
      less, greater_equals = self[1..-1].partition { yield(x, pivot) }
    else
      less, greater_equals = self[1..-1].partition { |x| x < pivot }
    end
    l = []
    g = []
    Process.fork {l = less.quick_sort }
    Process.fork {g = greater_equals.quick_sort}
    Process.waitall
    return l + [pivot] + g
  end
end

【问题讨论】:

  • Array[1] 是什么意思?
  • 具有单个元素的数组,例如 a = Array.new([1])
  • 你为什么不写[1]
  • 我是说这是它返回的,不是我想要的,而且我是 ruby​​ 新手,所以我不知道所有代码等价。
  • 顺便说一句,你有一个语法错误,其中一个块不包含正确的参数:less, greater_equals = self[1..-1].partition { yield(x, pivot) } 应该是less, greater_equals = self[1..-1].partition { |x| yield(x, pivot) }

标签: ruby multithreading sorting concurrency parallel-processing


【解决方案1】:

局部变量lg 不会超出Process.fork。它们仅在该块内有效。例如,

Process.fork{a = 2}
Process.wait
a #=> NameError: undefined local variable or method `a' for main:Object

在您的代码中,在您调用return l + [pivot] + g 时,在Process.fork 之前完成的lg 分配仍然有效。

顺便说一句,如果您打算将lgProcess.fork 传递,那么您在Process.fork 之前初始化这些变量是没有意义的。

【讨论】:

  • 但是根据我的阅读,如果我这样做l = Process.fork {less.quick_sort},L 现在是 fork 的 pid 而不是进程的返回。
【解决方案2】:

从您的示例看来,您正在尝试在实际想要使用 thread 的地方使用 Process。

进程:没有与它的调用者(父)共享资源

线程:与其父级共享内存

如果您将 Process.fork 替换为 Threads,您的示例将起作用:

l = []
g = []
left_thread = Thread.new {l = less.quick_sort }
right_thread = Thread.new {g = greater_equals.quick_sort}
left_thread.join
right_thread.join
return l. + [pivot] + g

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多