Ruby 并行排序
Ruby parallel sorting
我正在尝试创建排序算法的多线程版本。我不明白为什么这个算法总是 returns 只是 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
局部变量 l
和 g
不传递到 Process.fork
之外。它们仅在该块内有效。例如,
Process.fork{a = 2}
Process.wait
a #=> NameError: undefined local variable or method `a' for main:Object
在您的代码中,在 Process.fork
之前完成的 l
和 g
赋值在您调用 return l + [pivot] + g
时仍然有效。
顺便说一下,如果您打算从 Process.fork
传递 l
和 g
,那么您在 Process.fork
之前对这些变量进行初始化是没有意义的。
从您的示例来看,您似乎正在尝试在实际想要使用 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
我正在尝试创建排序算法的多线程版本。我不明白为什么这个算法总是 returns 只是 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
局部变量 l
和 g
不传递到 Process.fork
之外。它们仅在该块内有效。例如,
Process.fork{a = 2}
Process.wait
a #=> NameError: undefined local variable or method `a' for main:Object
在您的代码中,在 Process.fork
之前完成的 l
和 g
赋值在您调用 return l + [pivot] + g
时仍然有效。
顺便说一下,如果您打算从 Process.fork
传递 l
和 g
,那么您在 Process.fork
之前对这些变量进行初始化是没有意义的。
从您的示例来看,您似乎正在尝试在实际想要使用 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