Могут ли рубиновые волокна быть параллельными? - PullRequest
13 голосов
/ 18 июня 2010

Я пытаюсь ускорить работу своей программы, и мне сказали, что Ruby Fibers работают быстрее потоков и могут использовать преимущества нескольких ядер.Я посмотрел вокруг, но я просто не могу найти, как на самом деле запустить разные волокна одновременно.С потоками вы можете сделать это:

threads = []

threads << Thread.new {Do something}
threads << Thread.new {Do something}

threads.each {|thread| thread.join}

Я не вижу, как сделать что-то подобное с волокнами.Все, что я могу найти, это yield и resume, которые выглядят как куча пусков и остановок между волокнами.Есть ли способ сделать истинный параллелизм с волокнами?

Ответы [ 3 ]

16 голосов
/ 18 июня 2010

Нет, вы не можете выполнять параллелизм с Fiber с.Fiber s просто не являются конструкцией параллелизма, они являются конструкцией потока управления, как Exception s.Это целая точка из Fiber с: они никогда не работают параллельно, они взаимодействуют и детерминированы.Fiber s - сопрограммы.(На самом деле, я никогда не понимал, почему их просто не называют Coroutine с.)

Единственная конструкция параллелизма в Ruby - это Thread.

13 голосов
/ 15 мая 2014

Кажется, существует проблема терминологии между параллелизмом и параллелизмом.

Я просто не могу найти, как на самом деле запускать разные волокна одновременно.

Я думаю, что вына самом деле говорим о параллелизме, а не о параллелизме:

Параллельность - это когда две задачи могут запускаться, выполняться и завершаться в перекрывающиеся периоды времени.Это не обязательно означает, что они оба будут работать одновременно.Например.многозадачность на одноядерной машине. Параллелизм - это когда задачи выполняются буквально одновременно, например.на многоядерном процессоре

Цитата: Параллелизм и параллелизм - в чем разница? .

Также хорошо проиллюстрировано здесь: http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

Итак, чтобы ответить на вопрос:

Волокна - это примитивы для реализации облегченного кооперативного параллелизма в Ruby.

http://www.ruby -doc.org / core-2.1.1 / Fiber.html

Это не означает, что он может работать параллельно.

1 голос
/ 20 июня 2010

Если вы хотите истинный параллелизм, вам нужно использовать потоки с jruby (у которого на самом деле нет волокон, у него есть только потоки, по одному на волокно).

Другой вариант - «разветвляться» нановые процессы, которые могли бы выполнять вещи в истинной параллели на МРТ.

...