2013-04-01 2 views
0

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

  1. Почему это происходит? Это Rails или сторонние драгоценные камни, которые не являются потокобезопасными?
  2. Есть ли способ обойти это? Я рассматриваю возможность использования пула процессов, так же как пул потоков, за исключением того, что он тяжелее, для этого потребуется много памяти, но это будет дешевле, чем остановка всего приложения.
+2

Нам понадобится гораздо больше информации для устранения этой проблемы. Что происходит во время запроса? Если другие камни задействованы, каковы они? –

+0

Я не добавлял никаких изменений в рельсы по умолчанию (установите для config.threadsafe значение false). В то время как контроллер обрабатывает предыдущие запросы, ближайшие просто ждут. –

+0

Без информации о том, что происходит в этом контроллере, невозможно дать точные ответы. Все, что можно сделать, это угадать, что не очень полезно. Вы должны суммировать свой код, чтобы мы могли идентифицировать медленное место, а затем попытаемся найти исправление. –

ответ

2

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

Теперь существуют случаи, когда пользователю необходимо подождать результата, и в этом случае вы всегда можете использовать веб-узлы, или HTTP streaming.

Теперь у Ruby and Rails возникли проблемы с потоками, о которых вы можете прочитать в «Parallelism is a Myth in Ruby».

Раствор можно использовать в Rails, чтобы использовать серверы, как единорог, который разветвляется, как многие работники процесса, как вы хотите, и каждый из них будет работать независимо от других, Puma для создания мульти темы и т.д.

Теперь, если у вас есть действие, которое является тяжелым процессом, вам может потребоваться отложить работу в пуле процессов, например delayed_job. Вы даже можете создать хороший пользовательский интерфейс с JavaScript для получения статуса задания и отображения прогресса пользователю. Вы можете использовать пул задач, которые должны выполняться с помощью RabbitMQ, где другой процесс. На заднем плане можно слушать новые сообщения и действовать на них, а также давать ответ и т. Д.

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

2

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

Однако вы можете отключить это, включив опцию config.threadsafe! И используя многопоточный сервер, такой как Puma.

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

Вам понадобится реализация Ruby, которая поддерживает реальные потоки, такие как Rubinius или Jruby.

Смежные вопросы