Как я могу запустить метод контроллера в качестве фоновой задачи? - PullRequest
0 голосов
/ 13 ноября 2009

Я слышал о различных инструментах фоновых задач (delayed_job, starling, workling и т. Д.), Но, глядя на них, кажется, что они действительно способны запускать только методы на основе моделей (например, User.update_counters).

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

Это процесс, интенсивно использующий процессор, который может занять ~ 5-10 минут, поэтому я бы хотел, чтобы он работал, не мешая "обычным" операциям на сайте других пользователей.

Я неправильно понимаю, как работают эти другие инструменты? Или я что-то еще не рассматриваю?

Ответы [ 4 ]

2 голосов
/ 13 ноября 2009

Общепринятый способ работы состоит в том, чтобы перенести всю вашу сложную логику в модель и иметь контроллер только для направления запросов и ответов. Это то, что говорит теория «Толстые модели и стройные контроллеры». Переместите сложную логику в класс модели (который не обязательно должен быть классом ActiveRecord), и, возможно, у вас может быть задача rake, которая будет вызываться фоновым инструментом.

1 голос
/ 13 ноября 2009

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

Кроме того, поскольку вы говорите, что задача связана с ЦП и замедляет работу сайта, вы можете использовать nice (при условии, что вы работаете в системе UNIX) для настройки приоритета вашей задачи rake.

1 голос
/ 13 ноября 2009

Если вам действительно нужно запустить действие контроллера, вы можете использовать cron и wget или curl. Но я бы порекомендовал перенести вашу сложную логику в модель или библиотеку, чтобы вы могли затем вызывать ее вне контроллера, используя один из упомянутых вами фоновых инструментов.

0 голосов
/ 13 ноября 2009

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

...