Ruby / Rails синхронный менеджер заданий - PullRequest
5 голосов
/ 13 января 2011

hi
Я собираюсь настроить rails-сайт, где после некоторого начального пользовательского ввода будут сделаны тяжелые вычисления (через c-extension для ruby ​​будет использоваться многопоточность).так как эти вычисления будут занимать почти все процессорное время (и память), никогда не должно выполняться более одного вычисления одновременно.также я не могу использовать (асинхронные) фоновые задания (например, с отложенным заданием), так как рельсы должны показывать результаты этого расчета, а сайт должен работать без javascript.
, поэтому я предполагаю, что мне нужен отдельный процесс, где все экземпляры railsприходится ставить в очередь свои запросы на вычисления и ждать ответа (может быть, сообщение об ошибке, если очередь заполнена), что-то вроде синхронного менеджера заданий.

Кто-нибудь знает, есть ли гем / плагин с такой функциональностью?( nanite мне показалось довольно крутым, но, кажется, только асинхронным, поэтому экземпляры rails не будут знать, когда закончится вычисление. Это правильно?)
другая идея - написать свой собственный, используяраспределенный рубин (drb), но зачем изобретать колесо снова, если оно уже существует?

любая помощь будет оценена!

РЕДАКТИРОВАТЬ: из-за советов zaius я думаю, что я смогусделать это асинхронно, поэтому я собираюсь попробовать resque .

Ответы [ 2 ]

5 голосов
/ 13 января 2011

В Ruby есть мьютексы / семафоры.

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

Тем не менее, идея блокирования процесса переднего плана, пока другие задачи завершаются, мне не подходит. Если бы я делал это, я бы использовал фоновый рабочий, а затем использовал страницу (или iframe) с метатегом refresh для непрерывной проверки прогресса.

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

1 голос
/ 13 января 2011

Если у вас есть отдельный процесс, то у вас есть фоновая работа ... так что вы можете ее или не можете ...

Я сделал, чтобы веб-сайт записал параметры запроса в базу данных. Затем отдельный процесс ищет ожидающие запросы в базе данных - используя гем daemons . Он выполняет работу и записывает результаты обратно в базу данных.

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

Хотя я использую javascript для опроса.

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

Чтобы заставить поток веб-запроса ждать, просто выполните в нем цикл, проверяя базу данных, пока ответ не будет сохранен обратно в нее. Оказавшись там, вы можете завершить обсуждение.

HTH, Крис

...