Какой практический эффект разные модели потоков Ruby (Ruby vs JRuby) окажут на ваш код как разработчика?

Я пытаюсь понять практическое влияние различных моделей потоков между MRI Ruby 1.8 и JRuby.

Что эта разница означает для меня как разработчика?

А также, есть ли какие-либо практические примеры кода в MRI Ruby 1.8, который будет иметь худшие характеристики производительности на JRuby из-за различных моделей потоков?


person Charles Bain    schedule 16.06.2009    source источник
comment
igvita.com/2008/11/13 / concurrency-is-a-миф-в-рубине может быть полезным   -  person rogerdpack    schedule 31.12.2011
comment
Это отличная статья с простыми и действенными примерами. .   -  person AJP    schedule 07.10.2012


Ответы (3)


Состояние

  • ruby 1.8 имеет зеленые потоки, они быстро создаются / удаляются (как объекты), но на самом деле не выполняются параллельно и даже не планируются операционной системой, а виртуальной машиной
  • ruby 1.9 имеет реальные потоки, они медленно создаются / удаляются (как объекты) из-за вызовов ОС, но из-за GIL (глобальная блокировка интерпретатора), которая позволяет выполнять только один поток за раз, ни один из них не является по-настоящему параллельным
  • JRuby также имеет реальные потоки, запланированные ОС, и действительно параллельные

Вывод

Многопоточная программа, работающая на 2-ядерном ЦП, будет работать на JRuby быстрее, чем другие реализации, с точки зрения потоковой передачи.

Уведомление!

Многие существующие библиотеки Ruby не являются потокобезопасными, поэтому преимущество JRuby во много раз бесполезно.
Также обратите внимание, что многие методы программирования на Ruby (например, переменные классов) потребуют дополнительных усилий по программированию, чтобы гарантировать потокобезопасность (блокировки мьютексов, мониторы и т. д.), если нужно использовать потоки.

person clyfe    schedule 03.03.2010
comment
Когда вы говорите, что существующие библиотеки Ruby не являются потокобезопасными, вы имеете в виду стандартные библиотеки или библиотеки, установленные через Rubygems? - person Andrew Grimm; 30.05.2011
comment
Я имею в виду драгоценные камни. Точно не могу сказать о stdlib. - person clyfe; 31.05.2011

Потоки JRuby являются собственными системными потоками, поэтому они дают вам все преимущества многопоточного программирования (включая использование нескольких ядер процессора, если применимо). Однако в Ruby есть глобальная блокировка интерпретатора (GIL), которая предотвращает одновременное выполнение нескольких потоков. Таким образом, единственная реальная разница в производительности заключается в том, что ваши приложения MRI / YARV Ruby не смогут использовать все ядра вашего процессора, но ваши приложения JRuby с радостью это сделают.

Однако, если это не проблема, потоки MRI (теоретически я не тестировал это) немного быстрее, потому что они зеленые потоки, которые используют меньше системных ресурсов. YARV (Ruby 1.9) использует собственные системные потоки.

person Sasha Chedygov    schedule 16.06.2009

Я обычный пользователь JRuby, и самая большая разница в том, что потоки JRuby действительно параллельны. На самом деле это потоки системного уровня, поэтому их можно выполнять одновременно на нескольких ядрах. Я не знаю места, где код MRI Ruby 1.8 работает медленнее на JRuby. Вы можете проверить этот вопрос Есть ли в Ruby настоящая многопоточность?.

person Josh Moore    schedule 16.06.2009