Ruby on Rails: продолжайте собирать данные в фоновом режиме и сохранять в БД

#ruby-on-rails #multithreading #background

#ruby-on-rails #многопоточность #фон

Вопрос:

Вот мой сценарий: у меня есть некоторые данные, поступающие в последовательный порт. Я хочу продолжать собирать эти данные и сохранять в базе данных. Затем приложение rails использует эти данные из базы данных и показывает некоторую статистику, такую как графики и прочее.

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

Если есть лучший способ сделать это, пожалуйста, посоветуйте.

PS: У меня нет никаких проблем с чтением с последовательного порта. Речь идет о выполнении этой задачи из приложения rails в отдельном потоке.

Ответ №1:

Используйте драгоценный камень delayed_job.

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

Комментарии:

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

2. вы можете посмотреть railscast об этом драгоценном камне — railscasts.com/episodes/171-delayed-job или текстовая версия — asciicasts.com/episodes/171-delayed-job

3. хорошо! я только что посмотрел railcast, и, похоже, это именно то, что мне нужно. Однако у меня есть пара вопросов. Метод send_later в railcast вызывается в определенном методе контроллера. Я хочу, чтобы моя задача началась, как только запустится приложение rail (сервер запустится). Кроме того, выполняемое мной задание не имеет подключения к какому-либо контроллеру как таковому, так куда мне добавить метод, который будет вызываться с помощью send_later? и, наконец, моя работа выполняется бесконечно, как это влияет на эту договоренность?

4. Если вы используете capistrano для развертывания, посмотрите на это — github.com/collectiveidea/delayed_job/wiki /… . И если вы хотите добавить некоторые задания без подключения к какому-либо контроллеру, вы можете добавить эти задания в свою configinitializers папку

Ответ №2:

Еще одна вещь, которую вы можете проверить, — это resque gem, опубликованный на github, он использует redis в качестве рабочей очереди и имеет очень удобный веб-интерфейс, который помогает управлять рабочими потоками. Это очень похоже на отложенные задания, но может лучше соответствовать вашим потребностям.