Как обстоят дела с потоками, параллелизмом и разветвленными процессами в Ruby on Rails? - PullRequest
7 голосов
/ 24 сентября 2008

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 24 сентября 2008

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

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

3 голосов
/ 26 сентября 2008

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

3 голосов
/ 25 сентября 2008

Matz's Ruby 1.8 использует зеленые нити , а Matz's Ruby 1.9 будет использовать нативные O / S-потоки. Другие реализации Ruby 1.8, такие как JRuby и IronRuby, используют собственные потоки O / S. YARV, сокращение от "Another Another Ruby VM", также использует нативные потоки O / S, но имеет глобальную блокировку интерпретатора, чтобы гарантировать, что в любой момент времени выполняется только один поток Ruby.

2 голосов
/ 25 сентября 2008

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

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

1 голос
/ 26 сентября 2008

Ruby 1.9 добавляет легкие волокна:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...