Могу ли я запускать и останавливать работников delayed_job из моего приложения Rails? - PullRequest
4 голосов
/ 12 ноября 2009

У меня есть приложение, которое может извлечь выгоду из delayed_job и некоторой фоновой обработки. Дело в том, что мне не нужно / не нужно, чтобы работники delayed_job работали постоянно.

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

Есть ли способ запускать и останавливать обработку заданий (с помощью скрипта или рейка) из моего приложения только после определенных действий / событий?

Ответы [ 4 ]

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

Вы можете вызвать систему:

system "cd #{Rails.root} && rake delayed_job:start RAILS_ENV=production"

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

0 голосов
/ 12 января 2013

Если вы идете, чтобы остановить работника, вам выдается PID. Вы можете просто убить -9 PID, если ничего не помогает.

0 голосов
/ 10 февраля 2011

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

http://viatropos.com/blog/how-to-run-background-jobs-on-heroku-for-free/

Хотя это немного устарело. В теме есть интересный комментарий:

"Когда мне нужно отправить электронное письмо, скопировать файл и т. Д., Я в основном добавляю его в очередь. В конце каждого запроса он проверяет, есть ли что-либо в очереди. Если это так, то он использует Heroku API для установки работника на 1. В конце работника, выполняющего задачу, он проверяет, осталось ли что-либо в очереди. Если нет, то он устанавливает рабочих обратно на 0. Конечный результат - фоновый работник. просто поработайте несколько секунд здесь и там. Я могу выполнить всю необходимую фоновую обработку, и счет в конце месяца редко достигает 1 часа общей стоимости работы. Даже если это не проблема, я заплачу $ 0,05 для фоновой обработки. :) "

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

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

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

Delayed::Worker::sleep_delay = 60 * 5  # in your initializer.rb

Один работник будет просыпаться и проверять базу данных на наличие новых заданий каждые 5 минут. Такой способ не дает вам слишком много настраивать.

Но если вы действительно хотите запустить Delayed::Worker программно, найдите в этом классе work_off и реализуйте свой собственный script/run_jobs_and_exit скрипт. Вероятно, он должен выглядеть так же, как script/delayed_job - 3 строки.

...