Какой практический эффект будут иметь различные модели потоков Ruby (Ruby vs JRuby) для вашего кода как разработчика? - PullRequest
7 голосов
/ 16 июня 2009

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

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

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

Ответы [ 3 ]

11 голосов
/ 03 марта 2010

Государство

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

Заключение

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

Обратите внимание!

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

6 голосов
/ 16 июня 2009

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

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

3 голосов
/ 16 июня 2009

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

...