Я пытаюсь создать многопоточную версию алгоритма сортировки. Я не понимаю, почему этот алгоритм всегда возвращает только 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
2 ответа
Локальные переменные l
и g
не передаются за пределы Process.fork
. Они действительны только в этом блоке. Например,
Process.fork{a = 2}
Process.wait
a #=> NameError: undefined local variable or method `a' for main:Object
В вашем коде назначения l
и g
, выполненные до Process.fork
, по-прежнему действительны, когда вы вызываете return l + [pivot] + g
.
Кстати, если вы намеревались передать l
и g
из Process.fork
, то инициализация этих переменных до Process.fork
бессмысленна.
Из ваших примеров похоже, что вы пытаетесь использовать 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
Похожие вопросы
Новые вопросы
ruby
Ruby - это многоплатформенный динамический объектно-ориентированный интерпретируемый язык с открытым исходным кодом. Тег [ruby] предназначен для вопросов, связанных с языком Ruby, включая его синтаксис и его библиотеки. Вопросы Ruby on Rails должны быть помечены [ruby-on-rails].