Каково текущее состояние дел с многопоточностью, параллелизмом и разветвленными процессами в Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/129226

  •  02-07-2019
  •  | 
  •  

Вопрос

Ruby on Rails не очень хорошо обрабатывает многопоточные запросы-ответы, по крайней мере, ActiveRecord.

Представление о том, что одновременно активен только один запрос-ответ, может стать проблемой при создании веб-приложений, которые используют команду оболочки, выполнение которой занимает много времени.

Мне хотелось бы узнать ваше мнение по поводу такого рода установок?Возможно, Rails не подходит для некоторых приложений?

Кроме того, каково текущее состояние дел в отношении параллелизма в Ruby on Rails?Каковы лучшие практики.Есть ли способы устранения недостатков?

Это было полезно?

Решение

Rails в настоящее время не обрабатывает одновременные запросы в рамках одного Ruby-процесса MRI (Matz Ruby Interpreter).По сути, каждый запрос заключен в гигантский мьютекс.Много работы было проделано для того, чтобы сделать будущую версию Rails 2.2 поточно-ориентированной, но вы не получите от этого большой пользы при работе под Ruby 1.8x.Я не могу комментировать, будет ли Ruby 1.9 другим, потому что я не очень с ним знаком, но, вероятно, я бы так и не подумал.

Одна из областей, которая выглядит в этом отношении очень многообещающей, — это запуск Rails с использованием JRuby, поскольку общепризнано, что JVM хорошо справляется с многопоточностью. Арун Гупта от Sun Microsystems предоставили некоторые интересные показатели производительности об этой настройке недавно на RailsConf Europe.

Другие советы

Никогда не блокировать позволяет использовать неблокирующую функциональность без изменения способа написания программ.Это действительно интересный проект, и он был портирован для работы на Ruby 1.8.x (он основан на волокнах Ruby 1.9).Он работает как с PostgreSQL, так и с MySQL для выполнения неблокирующих запросов.А ориентиры сумасшедшие...

Использование Matz Ruby 1.8 зеленые нитки, а Ruby 1.9 от Matz будет использовать собственные потоки операционной системы.Другие реализации Ruby 1.8, такие как JRuby и IronRuby, используют собственные потоки операционной системы.YARV, сокращение от «Еще одна виртуальная машина Ruby», также использует собственные потоки операционной системы, но имеет глобальную блокировку интерпретатора, гарантирующую, что в любой момент времени выполняется только один поток Ruby.

Если то, что вы запускаете в оболочке, не требуется для рендеринга страницы (например,вы только запускаете задачи обслуживания или что-то в этом роде), вам следует запускать их как фоновые процессы.Посмотрите скворца и рабочего.

Если это не относится к вашей ситуации, вам придется убедиться, что работают несколько экземпляров ваших серверов приложений.Традиционно люди запускали несколько экземпляров Mongrel.Но сейчас я бы сказал, что самый простой способ создать надежную настройку — это использовать Фьюжн Пассажир.Это модуль Apache, который позволяет вам легко указать, сколько экземпляров (минимум и максимум) ваших серверов приложений вы хотите запустить.Остальное делает пассажир.И если я правильно помню, он не выполняет дурацкий циклический перебор для отправки запросов.Я думаю, это по наличию.

В Ruby 1.9 добавлены облегченные волокна:

http://www.infoq.com/news/2007/08/ruby-1-9-fibers

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top