2009-11-13 2 views
0

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

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

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

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

ответ

2

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

1

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

+0

Я на самом деле уже выполняю настройку cron w/wget, но сейчас, когда он работает, он забивает весь сайт, так как он настолько интенсивный. – Shpigford

0

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

1

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

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

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